Alıntı (acehreli:1323461554):
> Hani üye işlevler belirli bir nesne üzerinde işlerler ya... Yani aslında üye işlevin bir de gizli bir 'this' göstergesi olur ve üye işlev o göstergenin gösterdiği nesne üzerinde işler.
O söylediğim, C++ programcılarına çok yakın bir kavramdır. D'de de üye işlevler içinde 'this' diye bir kavram var. (Hem yapılarda hem sınıflarda.) O da aynen C++'ta olduğu gibi "şu anda üzerinde işlemekte olduğumuz nesne" anlamına geliyor. Bunu zaten D'nin kurucu işlevlerinde de görürüz:
import std.stdio;
class Sınıf
{
int i;
this(int i)
{
this.i = i;
}
void bilgi()
{
writefln("bilgi() %s adresindeki nesne üzerinde çağrıldı", &this);
writefln("Bu nesnenin i üyesinin değeri şu: %s", this.i);
}
}
void main()
{
auto nesne = new Sınıf(42);
nesne.bilgi();
}
Bir çıktısı:
'bilgi() 7FFF33D8CF28 adresindeki nesne üzerinde çağrıldı
Bu nesnenin i üyesinin değeri şu: 42
'
Yukarıda hem kurucu içinde hem de bilgi() içinde this kullanılıyor. İşte, nesnenin üyelerinin ve nesnenin üzerindeki işlemin bir araya gelerek çağrılması olayı D'de temsilcilerin gerçekleştirilmesinin aynısıymış.
Alıntı:
> Bunun örneğini sonra göstereceğim. Hatırlarsam... :)
Hatırladım! :-p Button ve addOnClicked() ile temsilci kullanımını basit bir örnekle göstereceğim. Yukarıda söylediğimin örneği olarak '&işlemciNesne.özelİşlem' kullanımına bakın:
import std.stdio;
/* Button gibi kullanılan bir sınıf */
class Düğme
{
/* Koda açıklık getirmek için tanımlanmış bir takma isim */
alias string delegate(Düğme) İşlemci;
/* Her Düğme nesnesinin işlemcileri var. Düğmeye basıldığında teker teker
* bunlar işletilecekler. */
İşlemci[] işlemler;
/* addOnClicked()'in benzeri olan bir işlev. Tek yaptığı, kendisine
* verilen işlemi basitçe işlemciler dizisine ekliyor. Daha sonradan
* düğmeye basıldığında işletecek. */
void ekle(İşlemci işlem)
{
işlemler ~= işlem;
}
/* Düğmeye basılmış. Bütün işlemleri teker teker işletiyor. Bu basit
* örnekte yalnızca onların sonuçlarını bir diziye yerleştirip diziyi
* yazdırıyoruz. */
void bas()
{
string[] sonuç;
foreach (işlem; işlemler) {
sonuç ~= işlem(this);
}
writeln(sonuç);
}
}
/* Burada asıl göstermek istediğim bu: Kendisi bir temsilci olmasa da, üye
* işlev temsilci gibi kullanılmaya uygun: Düğme alıyor ve string
* döndürüyor. Uygun. */
class İşlemciSınıf
{
string özelİşlem(Düğme düğme)
{
return "selam";
}
}
void main()
{
/* Daha sonradan basılacak olan bir düğme. */
auto düğme = new Düğme;
/* addOnClicked()'te olduğu gibi iki tane temsilci ekleyelim. */
düğme.ekle(
(Düğme) {
return "merhaba";
});
/* Değişiklik olsun diye farklı bir düzende. */
düğme.ekle((Düğme) { return "hello"; });
/* Önemli olan yer burası. delegate türünde olmayan bir nesnenin üzerinde
* çağrılan bir üye işlev, temsilci gibi kullanılıyor. Önemli: özelİşlem()
* burada çağrılmıyor. O daha sonra bas() içindeyken tam da bu nesne
* üzerinde işletilecek. */
auto işlemciNesne = new İşlemciSınıf;
düğme.ekle(&işlemciNesne.özelİşlem);
/* ... arada başka işlemler olabilir ... */
/* Kullanıcı sonunda düğmeye basıyor ve pencere sistemi bizim düğmenin
* bas() işlevini çağırıyor. */
düğme.bas();
}
Sonuçta iki temsilci ve tek "nesne"+"üye işlev" çağrıları şu çıktıyı üretiyorlar:
'["merhaba", "hello", "selam"]
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]