Dart 为什么可以';当重写==运算符时,我是否使用相等规则? void main()=>Foo()==1; 福班{ @凌驾 布尔运算符==(对象其他){ 打印(super==此);//true //打印(this==super);//编译错误 返回super==其他; } }
有两个问题Dart 为什么可以';当重写==运算符时,我是否使用相等规则? void main()=>Foo()==1; 福班{ @凌驾 布尔运算符==(对象其他){ 打印(super==此);//true //打印(this==super);//编译错误 返回super==其他; } },dart,Dart,有两个问题 为什么我不能做这个==super 如果查看return语句return super==other,您可以知道操作符=是在对象类上调用的,那么整个=实现是否不是已委托给对象类的调用 如果第二个问题不清楚,让我进一步解释。比如说我查了一下 Foo()==1 在Foo类中定义的=操作符将被调用,我所做的就是返回super==other,这意味着对象的=操作符正在被调用,other是int,那么上面代码中的Foo实例在哪里呢?这里,它只是Object和int。我认为super也在做其他
return super==other
,您可以知道操作符=
是在对象
类上调用的,那么整个=
实现是否不是已委托给对象
类的调用
Foo()==1
在
Foo
类中定义的=
操作符将被调用,我所做的就是返回super==other
,这意味着对象的=
操作符正在被调用,other
是int
,那么上面代码中的Foo
实例在哪里呢?这里,它只是Object
和int
。我认为super
也在做其他事情,不确定是什么。回答您的问题:
您不能执行this==super
,因为super
不是一个表达式,如果您尝试运行该程序,就会得到解释(分析的表达式可能会给出更好的解释):
bin/stackoverflow.dart:7:19:错误:无法将“super”用作表达式。
要将构造函数委托给超级构造函数,请将超级调用作为初始值设定项。
打印(this==super);//编译错误
^^^^^
这也是有意义的,因为super
不是一个对象。这是一个概念,我们可以用来指定是否要引用被重写的字段/方法。但是我们不能使用super
作为某种对象,因为我们的对象不是层中的多个对象,在这些层中,您可以提取一个层,然后将其表示为另一个对象。相反,我们的对象是一个基于如何定义类的组合实现
是的,当您返回super==other
时,您基本上是在调用对象的==
操作符
补充示例:
但是请记住,我们只是调用对象中定义的==
操作符。我们的目标仍然是一个组合数据结构,可以通过以下示例进行说明:
class A {
final int a = 5;
int getA() => a;
}
class B extends A {
int get a => 10;
int getA() {
return super.getA();
}
}
void main() {
print(B().getA()); // 10
}
您可以看到,即使我们调用super.getA()
,我们仍然在一个B
对象上运行,我们已经覆盖了a
字段,但是我们调用了a.getA()
方法。谢谢。除了第一个问题外,几乎所有的疑问都很清楚。正如你提到的“既然super不是一个对象”,当我们做super==
,它实际上不是一个super.=
?-super
然后变成了一个对象。如果我理解正确,你基本上说的是在做super==other
,我们实际上在调用Foo
的=
操作符,对吗?不,我们使用super
指向我们扩展的类中声明的方法(在本例中为Object
)。它只是一种语法,因为super
没有解析为任何内容(这就是为什么不能将其用作表达式的原因)因此,如果我们在Object
上调用==
操作符,那么在执行Foo()时,Foo
实例在Foo
的=
操作符实现中被引用/使用/提及==1
。我们不仅仅是将对象
与int
进行比较吗?我的英语不是很好,但我希望我能对您有所帮助。@iDecode这里记录了对象
中的=
运算符:。简而言之,它只是检查我们谈论的对象实例是否完全相同。在您的情况下,您是只需从对象
调用==
操作符,这与没有覆盖=
操作符的情况相同。