我想重载 Dart 中的比较运算符(==)来比较结构。现在,当我已经重载了基类的比较运算符并想要重用它时,我不确定如何为派生类执行此操作。
假设我有一个基类,例如:
class Base
{
int _a;
String _b;
bool operator ==(Base other)
{
if (identical(other, this)) return true;
if (_a != other._a) return false;
if (_b != other._b) return false;
return true;
}
}
然后我声明我的派生类添加了额外的字段并且还想重载运算符==。我只想比较派生类中的附加字段,并将 Base 字段的比较委托给 Base 类。在其他编程语言中,我可以做类似Base::operator==(other)
or的事情super.equals(other)
,但在 Dart 中,我不知道什么是最好的方法。
class Derived extends Base
{
int _c; // additional field
bool operator ==(Derived other)
{
if (identical(other, this)) return true;
if (_c != other._c) return false; // Comparison of new field
// The following approach gives the compiler error:
// Equality expression cannot be operand of another equality expression.
if (!(super.==(other))) return false;
// The following produces "Unnecessary cast" warnings
// It also only recursively calls the Derived operator
if ((this as Base) != (other as Base)) return false;
return true;
}
}
我想我能做的是:
- 比较派生类中基类的所有字段:如果基类 get 发生更改,则非常容易出错,并且当基类和派生类位于不同的包中时也不起作用。
- 声明一个
equals
与当前在其中具有相同逻辑的函数operator ==
,调用super.equals()
以比较基类并将所有调用委托operator==
给该equals
函数。然而,它看起来并不太吸引人来实现equals
和operator ==
.
那么这个问题的最佳或推荐解决方案是什么?