Dart 如果getter存在,则无法识别扩展setter
(Dart 2.10.4) 我注意到在实现扩展设置程序时出现了一种奇怪的行为。如果原始类中存在与setter同名的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通常将具有相同基名称的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>和treati+=1
asthis.i+=1
,类似地j+=1代码>表示C.j+=1代码>
为此,静态扩展中的getter/setter被视为与类的实例变量不同的变量。如果“一般认为它具有该属性,那么相应的扩展setter(或getter)将不适用”,那么为什么常规的非扩展setter(或getter)会适用?如果这是一个经过深思熟虑的设计决策,那么它的好处是什么?好处是一个更简单的模型,在这个模型中,一个接口被认为要么有一个给定名称的成员,要么没有。有一个没有getter的setter是非常罕见的,并且不是专门为之设计的,所以更多的是关于是否是该名称的变量,以及该变量是否为final。对于子类重写,与其说是接口建模,不如说是实现继承。您可以选择从超类继承一个getter或setter,并且可以始终使用get foo=>super.foo
,因此不需要声明就更容易了。