Dart实现抽象类:为何final字段仍需实现setter?
Dart抽象类实现时未定义setter报错的原因
先看你给出的抽象类与实现类代码:
抽象类API
abstract class API { //* ---- abstract fields , Methods ---- *// int? timeOut; int? getTimeOut(); }
实现类GetData
class GetData implements API { @override final int? timeOut; GetData(int? ta) : timeOut = ta; @override int? getTimeOut() { return timeOut; } }
报错核心原因
Dart里,类的普通实例字段(比如API中的int? timeOut;)会自动生成隐式的getter和setter方法。当用implements实现抽象类时,必须严格遵守抽象类的接口契约——也就是要实现抽象类暴露的所有成员,包括该字段对应的getter和setter。
而你在GetData中把timeOut声明为final,final字段在Dart中只会生成getter,不会生成setter。这就导致GetData没有实现API类中timeOut字段要求的setter,因此编译器会抛出错误。
可行解决方案
有三种方式可以解决这个问题:
将抽象类的字段改为final
如果你希望timeOut是只读属性,直接把抽象类里的timeOut设为final,这样它只会生成getter,实现类的final字段就能匹配接口要求:abstract class API { final int? timeOut; API(this.timeOut); // 需要添加构造函数初始化final字段 int? getTimeOut(); }抽象类中显式定义只读getter
不用普通字段,而是显式定义timeOut的getter,这样接口就只要求实现getter,无需setter:abstract class API { int? get timeOut; // 显式声明只读getter int? getTimeOut(); }移除实现类的final修饰符
如果你需要保留API类中timeOut的可写性,那么实现类里不能把timeOut设为final,这样会自动生成setter,满足接口契约:class GetData implements API { @override int? timeOut; GetData(int? ta) : timeOut = ta; @override int? getTimeOut() { return timeOut; } }
内容的提问来源于stack exchange,提问作者Mahmoud Habib
相关产品推荐
相关产品推荐

