Delegateler - 1

Delegatelere giriş...

Senaryomuz şöyle olsun:

Diyelim ki, birbirlerini tanımayan 2 classımız var: BirClass ve DigerClass.

BirClasstan DigerClassın bir metodunu çağıracağız, ama aynı zamanda da istediğimiz herhangi bir koşula uygun durumda, DigerClassın Birclass içindeki bir metodu çağırmasını isteyeceğiz.

Eskiden C++ zamanında değişkenlerimiz vardı, bir de pointerlarımız. Yani işaretçiler/işaret ediciler vardı. Görevi, herhangi bir değişkenin hafızada bulunduğu adresi tutarak, kendisi üzerinden o değişkene ulaşabilmemizi sağlamaktı. Programcılık hayatımızı zaman zaman oldukça rahatlatıyordu.

C# içerisinde bu point etme olayını biraz daha abartarak sadece değişkenleri değil, metodları point etmeyi getirdiler. Yani classımız içerisindeki bir metodun hafızada bulunduğu adresi point eden bir metod pointer. Kulağa enteresan geldiğinin farkındayım. Ama birazdan örneklerle anlatmaya çalışacağım bu işlev sayesinde hayatımızın nasıl kolaylaştığını göreceksiniz.

Neyse ne demişler az laf çok iş:

.NET dünyasında bu bahsettiğim metod point etme olayı delegateler sayesinde oluyor.

Önce bir delegate tanımlaması görelim:

delegate void BenimHandler();

Bu tanımlama ile yapmak istediğimiz şu: BenimHandler adında parametresi olmayan ve bir değer döndürmeyen bir metodu işaret edeceğini belirtiyoruz.

İstersek parametre alan ve/veya bir değer döndüren metodları da point edebiliriz.

public delegate void ClickEventHandler(string Mesaj);
public delegate int IslemHandler(int a, int b);

vb..

Delegate isimlerinin sonunda Handler ifadesinin yer alması tamamen racondan gelir. Yazmak zorunda olduğunuzu zannetmeyin.

Neyse biz classlarımıza geri dönelim. BirClasstan DigerClassın bir metodunu çağıracağımızı ama aynı zamanda herhangi bir koşula uygun durum olduğu takdirde de BirClassın bir metodunun devreye girmesini istiyorduk.

Kodlarımız:

public delegate void BenimHandler(); // Delegate tanımlama

public class BirClass
{

    public void IslemGerceklestir()
    {
        DigerClass clsDiger = new DigerClass();
        clsDiger.Handler = new BenimHandler(BenimMetod); // BenimMetod() değil, parantez yok dikkat!
        clsDiger.IslemYap();
    }

    public void BenimMetod()
    {
        Console.WriteLine("Bir Class içerisinde BeninMetod çalıştı");
    }
}

public class DigerClass
{
    BenimHandler handler; // racona uygun olsun diye Property sini kullanıyoruz.

    public BenimHandler Handler
    {
        get { return handler; }
        set { handler = value; }
    }

    public void IslemYap()
    {
        Console.WriteLine("Diger Class içerisinde IslemYap çalıştı");
        Handler.Invoke(); // çağıracağı metodun adını bilmediği için Invoke metodunu kullanıyor
    }
}

Void main içerisinden bu yazdığımız sınıfları kullanalım şimdi de:

static void Main(string[] args)
{
    BirClass clsBir = new BirClass();
    clsBir.IslemGerceklestir();
}

İşte sonuç:

delegate console sonuç

DEVAMI İÇİN TIKLAYINIZ