(Sonradan not: Bu yazdıklarımın yukarıdaki örnekten farkı yok aslında.)
TDPL'de 'alias this' ve iç sınıf olanaklarının çoklu kalıtım için nasıl bir araya getirildikleri anlatılıyor. Özetleyeceğim.
Şekil isimli bir üst sınıftan türetmek istediğimiz kendi şekil sınıfımız var. Ek olarak, bu şekil sınıfının bir veritabanına kaydedilebilmesi için, veri tabanı kütüphanesinin DbNesnesi isimli sınıfından türetilmiş olması gerekiyor.
İşte o bir sorun: iki sınıftan türetemeyiz:
class Şekil
{}
class DbNesnesi
{
abstract void kaydet();
}
class KayıtlıŞekil : Şekil, DbNesnesi // <-- DERLEME HATASI
{}
Bir çözüm, DbNesnesi'ni bir üye yapmak ve kendimizi 'alias this' ile DbNesnesi yerine de geçirtmek. (Gerektiğinde çoklu kalıtım D'de böyle sağlanıyor.)
class KayıtlıŞekil : Şekil
{
DbNesnesi kayıt;
alias kayıt this; // bunun sayesinde bir DbNesnesi olarak
// da kullanılabiliyoruz (D'nin çoklu
// kalıtımı bu)
}
Ama o kadarı yeterli değil, çünkü DbNesnesi soyut bir sınıftır. Normalde Şekil'leri kaydetmeyi bilen bir sınıfı DbNesnesi'nden türetmek isteriz:
/* Şekil kaydetmeyi bu sınıf bilir */
class ŞekilDbNesnesi : DbNesnesi
{
Şekil şekil;
/* Daha önce söylediğim gibi, Şekil'in bu sınıfın
* kurucusuna verilmesi gerekir */
this(Şekil şekil)
{
this.şekil = şekil;
}
void kaydet()
{
writeln("Şekil kaydediliyor");
}
}
O yüzden KayıtlıŞekil içinde aslında somut olarak ondan bir nesne oluşturmak gerekir:
class KayıtlıŞekil : Şekil
{
DbNesnesi kayıt;
alias kayıt this;
this()
{
/* Somut ŞekilDbNesnesi'ne this ile kendimizi
* tanıtıyoruz */
this.kayıt = new ŞekilDbNesnesi(this);
}
}
Bir önceki yazdığımdaki gibi, ŞekilDbNesnesi'ni bir iç sınıf yaptığımızda işler daha kolay hale geliyor:
class KayıtlıŞekil : Şekil
{
DbNesnesi kayıt;
alias kayıt this;
/* Dış sınıfın bütün üyeleri bu sınıfa açık */
class ŞekilDbNesnesi : DbNesnesi
{
void kaydet()
{
writeln("Şekil kaydediliyor");
}
}
this()
{
this.kayıt = this.new ŞekilDbNesnesi;
}
}
Sonuçta farklı şeyler söylenmedi. Böyle daha kolay oluyor işte... :)
Bütün kod şöyle:
import std.stdio;
class Şekil
{}
class DbNesnesi
{
abstract void kaydet();
}
class KayıtlıŞekil : Şekil
{
DbNesnesi kayıt;
alias kayıt this;
/* Dış sınıfın bütün üyeleri bu sınıfa açık */
class ŞekilDbNesnesi : DbNesnesi
{
void kaydet()
{
writeln("Şekil kaydediliyor");
}
}
this()
{
this.kayıt = this.new ŞekilDbNesnesi;
}
}
void main()
{
auto şekil = new KayıtlıŞekil;
dbİşlevi(şekil);
}
void dbİşlevi(DbNesnesi nesne)
{
nesne.kaydet();
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]