class MyClass {
@override
bool operator ==(other) {
// compare this to other
}
}
但这样做不安全。other未指定为类型,可能会发生意外情况。例如:
void main() {
var a = A(1);
var b = B(1);
var result = a == b;
print(result); //result is true
}
class A {
A(this.index);
final int index;
@override
bool operator ==(other) => other.index == index;
}
class B {
B(this.index);
final int index;
}
所以你可以这样做:
class A {
A(this.index);
final int index;
@override
bool operator ==(covariant A other) => other.index == index;
}
class A {
A(this.index);
final int index;
@override
bool operator ==(other) => other is A && (other.index == index);
@override
int get hashCode => index;
}
6条答案
按热度按时间4ktjp1zp1#
当你在新版本中使用
==
操作符重载时,你选择的答案不再有效。现在你需要做的是:但这样做不安全。
other
未指定为类型,可能会发生意外情况。例如:所以你可以这样做:
您需要使用
covariant
。因为Object重载了==
运算符。或者你可以
测试对象类型:
访视:hash_and_equals
vi4fp9gy2#
Dart不支持使用operator关键字后跟要重载的运算符的运算符重载。以下示例为MyClass对象重载**==**运算符:
几乎所有的Dart内置操作符都可以重载,只有几个值得注意的例外,即赋值操作符**=和引用等价操作符==(不再存在)。
至于运算符重载的优点,它允许您重用具有众所周知的语义含义的运算符,如==或+,用于对象上的运算。例如,如果您有一个Matrix类重载了+运算符,那么您可以使用语法m1 + m2添加两个矩阵,而不是使用更麻烦的m1.plus(m2)**
bogh5gae3#
为了扩展Lars的答案,还可以使用内联函数语法重载运算符。
798qvoo84#
学习如何使用运算符重载的一个令人惊奇的例子是在dart中处理复数的类:
vwhgwdsa5#
从Dart 2.7版开始,您可以向现有类添加运算符,例如:
nom7f22z6#
使用复数作为示例,我可以实现“Complex * num”,如下所示:
但是如何实现“num * Complex”呢?可能吗?