Dart 如果getter存在,则无法识别扩展setter

Dart 如果getter存在,则无法识别扩展setter,dart,Dart,(Dart 2.10.4) 我注意到在实现扩展设置程序时出现了一种奇怪的行为。如果原始类中存在与setter同名的getter,则setter将无法识别 为什么会这样?这是一个深思熟虑的设计决定 Dart通常将具有相同基名称的getter和setter视为同一事物的两面,因此如果接口具有getter(或setter),则通常认为它具有该属性,然后相应的扩展setter(或getter)将不适用 唯一可以真正将getter和setter分开处理的地方是子类只重写超类中的一个getter和set

(Dart 2.10.4) 我注意到在实现扩展设置程序时出现了一种奇怪的行为。如果原始类中存在与setter同名的getter,则setter将无法识别


为什么会这样?

这是一个深思熟虑的设计决定

Dart通常将具有相同基名称的getter和setter视为同一事物的两面,因此如果接口具有getter(或setter),则通常认为它具有该属性,然后相应的扩展setter(或getter)将不适用

唯一可以真正将getter和setter分开处理的地方是子类只重写超类中的一个getter和setter。在几乎所有其他情况下,拥有getter或setter意味着拥有该属性

设计的原因基本上是,如果您写入
++i
,或
i+=1
,或
i=i+1
,则读取和写入必须引用相同的变量。其他任何东西都将是非常脆弱和容易出错的

如果你有

inti=0;
int j=0;
C类{
静态最终int j=1;
最终int i=2;
foo(){
i+=1;
j+=1;
}
}
i+=1
不会读取最终的
C.i
并写入顶级变量, 并且
j+=1
不会读取最终的静态
C.j
并写入顶级变量。 相反,在
foo
中查找
i
将始终找到
final int i=2C
的code>和treat
i+=1
as
this.i+=1
,类似地
j+=1表示
C.j+=1


为此,静态扩展中的getter/setter被视为与类的实例变量不同的变量。

如果“一般认为它具有该属性,那么相应的扩展setter(或getter)将不适用”,那么为什么常规的非扩展setter(或getter)会适用?如果这是一个经过深思熟虑的设计决策,那么它的好处是什么?好处是一个更简单的模型,在这个模型中,一个接口被认为要么有一个给定名称的成员,要么没有。有一个没有getter的setter是非常罕见的,并且不是专门为之设计的,所以更多的是关于是否是该名称的变量,以及该变量是否为final。对于子类重写,与其说是接口建模,不如说是实现继承。您可以选择从超类继承一个getter或setter,并且可以始终使用
get foo=>super.foo
,因此不需要声明就更容易了。