D Programlama Dili - Çözümler

Object

  1. 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));
        }
    }
    
  2. 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);
        }
    }
    
  3. 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) {
                    /* Sıralamaları bu noktada belli oldu. */
                    return karşılaştırma;
                }
            }
    
            /* Buraya kadar gelinmişse eşitler demektir. */
            return 0;
        }
    
        override size_t toHash() const {
            /* 'noktalar' üyesini bir dizi olarak tanımladığımız
             * için dizilerin toHash algoritmasından
             * yararlanabiliriz. */
            return typeid(noktalar).getHash(&noktalar);
        }
    }