D.ershane Çözümleri Ddili.org

Object Çözümleri

  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:
  2. 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);
        }
    }
    
  3. 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:
  4. 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);
        }
    }
    
  5. Açıklamaları kodun içine yazdım:
  6. 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);
        }
    }