- Eşitlik karşılaştırmasında öncelikle
sağdaki'nin null olmadığına ve yalnızca x ve y üyelerine bakmak yeterli olur:
enum Renk { mavi, yeşil, kırmızı }
class Nokta {
int x;
int y;
Renk renk;
override bool opEquals(Object o) const {
const sağdaki = cast(const Nokta)o;
return (sağdaki &&
(x == sağdaki.x) &&
(y == sağdaki.y));
}
}
- Sağdaki nesnenin türü de
Nokta olduğunda önce x'e sonra y'ye göre karşılaştırılıyor:
class Nokta {
int x;
int y;
Renk renk;
override int opCmp(Object o) const {
const sağdaki = cast(const Nokta)o;
enforce(sağdaki);
return (x != sağdaki.x
? x - sağdaki.x
: y - sağdaki.y);
}
}
- Aşağıdaki
opCmp içinde tür dönüştürürken const ÜçgenBölge yazılamadığına dikkat edin. Bunun nedeni, sağdaki'nin türü const ÜçgenBölge olduğunda onun üyesi olan sağdaki.noktalar'ın da const olacağı ve const değişkenin nokta.opCmp'a parametre olarak gönderilemeyeceğidir. (opCmp'ın parametresinin const Object değil, Object olduğunu hatırlayın.)
class ÜçgenBölge {
Nokta[3] noktalar;
this(Nokta bir, Nokta iki, Nokta üç) {
noktalar = [ bir, iki, üç ];
}
override bool opEquals(Object o) const {
const sağdaki = cast(const ÜçgenBölge)o;
return sağdaki && (noktalar == sağdaki.noktalar);
}
override int opCmp(Object o) const {
auto sağdaki = cast(ÜçgenBölge)o;
enforce(sağdaki);
foreach (i, nokta; noktalar) {
immutable karşılaştırma =
nokta.opCmp(sağdaki.noktalar[i]);
if (karşılaştırma != 0) {
return karşılaştırma;
}
}
return 0;
}
override size_t toHash() const {
return typeid(noktalar).getHash(&noktalar);
}
}