Dart中如何重写抽象类的setter使属性变为final
正确实现final属性并满足抽象类setter要求的方案
问题原因分析
你之前的setter实现出现栈溢出,是因为在setter方法里直接写value = newValue会无限递归调用自身的setter,导致调用栈被耗尽。另外,由于抽象类Foo定义了value的setter,任何实现它的类必须提供该setter的具体实现,这就是最初代码提示“缺少setter实现”的原因。
正确实现方式
因为你需要value是final(初始化后不可修改),所以setter的实现要体现“不可修改”的语义,最合理的方式是在setter中抛出明确的错误,告知调用者该属性不允许被修改:
class Bar implements Foo<String> { @override final String value; const Bar(this.value); @override set value(String newValue) { throw UnsupportedError('value是final属性,无法修改'); } }
这样当调用bar.value = 'world'时,会直接抛出UnsupportedError,清晰传递“属性不可变”的意图,同时满足了抽象类Foo对setter的实现要求。
可选方案(不推荐)
如果不想抛出异常,也可以选择忽略赋值操作,但这种方式会隐藏错误,可能让调用者误以为赋值成功,因此不建议使用:
class Bar implements Foo<String> { @override final String value; const Bar(this.value); @override set value(String newValue) { // 忽略赋值请求,不做任何操作 } }
内容的提问来源于stack exchange,提问作者user9836706
相关产品推荐
相关产品推荐

