Object Çözümleri
- 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 const bool opEquals(Object o)
{
auto sağdaki = cast(const Nokta)o;
return
sağdaki && (x == sağdaki.x) && (y == sağdaki.y);
}
}
- Sağdaki nesnenin bu nesnenin türünden olmadığı durumda nesnelerin
typeid'lerini karşılaştırarak sıralamayı derleyiciye bırakıyoruz. Aynı olduklarında ise önce x'e sonra y'ye göre karşılaştırıyoruz:
class Nokta
{
int x;
int y;
Renk renk;
// ...
override const int opCmp(Object o)
{
if (typeid(this) != typeid(o)) {
return typeid(this).opCmp(typeid(o));
}
auto sağdaki = cast(const Nokta)o;
return (x != sağdaki.x
? x - sağdaki.x
: y - sağdaki.y);
}
}
- Açıklamaları kodun içine yazdım:
class ÜçgenBölge
{
Nokta[3] noktalar;
// ...
override const bool opEquals(Object o)
{
auto sağdaki = cast(const ÜçgenBölge)o;
return sağdaki && (noktalar == sağdaki.noktalar);
}
override const int opCmp(Object o)
{
if (typeid(this) != typeid(o)) {
return typeid(this).opCmp(typeid(o));
}
auto sağdaki = cast(const ÜçgenBölge)o;
foreach (i, nokta; noktalar) {
const int karşılaştırma =
nokta.opCmp(sağdaki.noktalar[i]);
if (karşılaştırma != 0) {
/* Sıralamaları bu noktada belli oldu. */
return karşılaştırma;
}
}
/* Buraya kadar gelinmişse eşitler demektir. */
return 0;
}
override const hash_t toHash()
{
/* 'noktalar' üyesini bir dizi olarak tanımladığımız
* için dizilerin toHash algoritmasından
* yararlanabiliriz. */
return typeid(noktalar).getHash(&noktalar);
}
}