Eğer bir sınıf şablonuyla ilgileniyorsak, o sınıfın üyelerinin türü dışarıdan belirleniyor demektir.
Örneğin x,y koordinatlarını tutmak için çeşitli türler kullanabiliriz. Bunu kullanıcıya bırakırsak:
class Nokta(T)
{
T x;
T y;
this(T x, T y)
{
this.x = x;
this.y = y;
}
}
void main()
{
auto hassasNokta0 = new Nokta!double(1.1, 2.2);
// Üsttekiyle aynı şey:
auto hassasNokta1 = new Nokta!(double)(1.1, 2.2);
// Yani tek bir şablon parametresi varsa, türün etrafına
// parantez yazmak gerekmiyor.
// Bu da int kullandığı için noktayı düzlemde diğerleri
// kadar hassas olarak tutamıyor
auto tamsayıNokta = new Nokta!int(3, 4);
}
Yani sınıfın tanımı içinde x,y koordinatlarının geçtiği yerlerde özel bir sınıf belirtmek yerine T diyoruz. Sınıf hangi türle oluşturulmuşsa, T o tür anlamına geliyor. Tabii temel türler kullanmak zorunda da değiliz. Örneğin 'Nokta!BigInt' diye bir kullanıcı türüyle de kullanabiliriz.
D'de ne kadar önemli olduğunu daha bilmiyorum ama C++'da şablonların kullanımı hoş olmadığı için, sınıf şablonlarının yanında bir de işlev şablonu verilir.
Bunu 'pair' ve 'make_pair' gösterebilirim:
foo(pair<double, double>(0.25, 0.35));
yerine, tür otomatik olarak çıkarsanabilsin diye 'make_pair' işlevi kullanılır:
foo(make_pair(0.25, 0.35));
D kodlarında da böyle bir kolaylık istersek, 'make_pair''in benzerini 'Nokta' için aşağıdaki gibi yazabiliriz.
'main' içinde artık 'Nokta' şablonunun türünü açıkça belirlemek zorunda kalmıyoruz. Biz 'double' veya 'int' kullanıyoruz, gerisi otomatik olarak hallediliyor:
class Nokta(T)
{
T x;
T y;
this(T x, T y)
{
this.x = x;
this.y = y;
}
}
// Kolaylık işlevi
Nokta!T Nokta_yap(T)(T x, T y)
{
return new Nokta!T(x, y);
}
void main()
{
auto hassasNokta0 = Nokta_yap(1.1, 2.2);
auto tamsayıNokta = Nokta_yap(3, 4);
}
Ama bunun D'de ne kadar yararlı olduğundan emin değilim. 'new' anahtar sözcüğünün işlevin içinde gizli kalması iyi mi kötü mü karar veremiyorum. :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]