You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:52:42