- 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);
}
}