D.ershane Çözümleri Ddili.org

Türeme Çözümleri

  1. Üst sınıfın abstract olarak belirttiği işlev alt sınıflar tarafından override anahtar sözcüğü ile tanımlanır:
  2. import std.stdio;
    
    class DemirYoluAracı
    {
        void ilerle(in int kilometre)
        {
            write(kilometre, " kilometre: ");
    
            foreach (i; 0 .. kilometre) {
                write(ses(), ' ');
            }
    
            writeln();
        }
    
        abstract string ses();
    }
    
    class Drezin : DemirYoluAracı
    {
        override string ses()
        {
            return "of puf";
        }
    }
    
    class Vagon : DemirYoluAracı
    {
        override string ses()
        {
            return "takıtak tukutak";
        }
    }
    
    class Lokomotif : DemirYoluAracı
    {
        override string ses()
        {
            return "çuf çuf";
        }
    }
    
    void main()
    {
        auto drezin = new Drezin;
        drezin.ilerle(2);
    
        auto vagon = new Vagon;
        vagon.ilerle(3);
    
        auto lokomotif = new Lokomotif;
        lokomotif.ilerle(4);
    }
    
  3. Bu örnekte Tren'in sesinin yalnızca lokomotif üyesine bağlı olduğunu varsayıyoruz:
  4. // ...
    
    class Tren : DemirYoluAracı
    {
        Lokomotif lokomotif;
        Vagon[] vagonlar;
    
        abstract void indir();
        abstract void bindir();
    
        override string ses()
        {
            return lokomotif.ses();
        }
    }
    
    class Kondüktör
    {}
    
    class YolcuTreni : Tren
    {
        Kondüktör[] kondüktörler;
    
        override void indir()
        {
            writeln("yolcular iniyor");
        }
    
        override void bindir()
        {
            writeln("yolcular biniyor");
        }
    }
    
    void main()
    {
        auto tren = new YolcuTreni;
        tren.ilerle(1);
    }
    

    Tren'in lokomotif üyesi henüz ilklenmediğinden program çöker:

    Segmentation fault
    

    lokomotif Tren'in kurucusu içinde ilklenebilir:

    class Tren : DemirYoluAracı
    {
    // ...
        this()
        {
            lokomotif = new Lokomotif;
        }
    // ...
    }
    

    Başka bir tasarım, Lokomotif nesnesinin Tren'e dışarıdan verilmesidir:

    class Tren : DemirYoluAracı
    {
    // ...
        this(Lokomotif lokomotif)
        {
            this.lokomotif = lokomotif;
        }
    // ...
    }
    
    class YolcuTreni : Tren
    {
    // ...
        this(Lokomotif lokomotif)
        {
            super(lokomotif);
        }
    // ...
    }
    
    void main()
    {
        auto lokomotif = new Lokomotif;
        auto tren = new YolcuTreni(lokomotif);
        tren.ilerle(1);
    }
    

    Dikkat ederseniz main() içinde oluşturulan Lokomotif önce YolcuTreni'ne, onun tarafından da kendi üst sınıfı olan Tren'e geçirilmektedir.