我目前正在学习D,并且正在努力了解操作符重载如何在类中起作用?覆盖opCmp是有意义的,并且对于结构正确工作,但是对于类,它需要将右侧作为Object而不是我的类型。
这意味着我无法访问任何成员进行比较。那么过载有什么意义呢?我想念什么吗?
答案 0 :(得分:2)
确保您可以访问您的成员:
class MyClass {
int member;
override int opCmp(Object other) {
if (auto mcOther = cast(MyClass)other) {
// other, and thus mcOther, is an instance of MyClass.
// So we can access its members normally:
return member < mcOther.member ? -1
: member > mcOther.member ? 1
: 0;
} else {
// other is not a MyClass, so we give up:
assert(0, "Can't compare MyClass with just anything!");
}
}
}
类opCmp
之所以使用Object
作为参数的原因是,它是在Object
类中引入的,每个D类都从该类派生。引入opCmp
可以说是一个明智的选择,但如今已经不多了。但是,由于我们不想破坏将opCmp
(以及opEquals
,toHash
和toString
)与类一起使用的所有D代码,因此有点选择。