Türeme Çözümleri
- Üst sınıfın
abstractolarak belirttiği işlev alt sınıflar tarafındanoverrideanahtar sözcüğü ile tanımlanır: - Bu örnekte
Tren'in sesinin yalnızcalokomotifüyesine bağlı olduğunu varsayıyoruz:
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); }
// ... 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.