C # iki terimi bilir delegate
ve event
. Birincisi ile başlayalım.
Temsilci
A delegate
, bir yönteme referanstır. Tıpkı bir örneğe referans oluşturabileceğiniz gibi:
MyClass instance = myFactory.GetInstance();
Bir yönteme başvuru oluşturmak için bir temsilci kullanabilirsiniz:
Action myMethod = myFactory.GetInstance;
Artık bir yönteme bu başvurunuz olduğuna göre, yöntemi başvuru yoluyla çağırabilirsiniz:
MyClass instance = myMethod();
Ama neden ki? Ayrıca myFactory.GetInstance()
doğrudan arayabilirsiniz . Bu durumda yapabilirsiniz. Bununla birlikte, uygulamanın geri kalanının bilgi sahibi olmasını myFactory
veya myFactory.GetInstance()
doğrudan aramasını istemediğiniz yerleri düşünmeniz gereken birçok durum vardır .
Değiştirmeye muktedir istiyorsanız bariz biridir myFactory.GetInstance()
içine myOfflineFakeFactory.GetInstance()
bir merkezi bir konum (aka gelen fabrika yöntemi desen ).
Fabrika yöntemi desen
Yani, bir TheOtherClass
sınıfınız varsa ve kullanması gerekiyorsa myFactory.GetInstance()
, kod delegeler olmadan böyle görünecektir ( TheOtherClass
türünüzü bilmeniz gerekir myFactory
):
TheOtherClass toc;
//...
toc.SetFactory(myFactory);
class TheOtherClass
{
public void SetFactory(MyFactory factory)
{
// set here
}
}
Temsilci kullanırsanız fabrikamın türünü göstermeniz gerekmez:
TheOtherClass toc;
//...
Action factoryMethod = myFactory.GetInstance;
toc.SetFactoryMethod(factoryMethod);
class TheOtherClass
{
public void SetFactoryMethod(Action factoryMethod)
{
// set here
}
}
Böylece, başka bir sınıfa başka bir sınıfa verebilirsiniz, türünüzü bunlara maruz bırakmadan. Gösterdiğiniz tek şey, yönteminizin imzasıdır (kaç parametreniz ve benzeri).
"Metodumun imzası", bunu daha önce nereden duydum? O evet, arayüzler !!! arayüzler bütün bir sınıfın imzasını tanımlar. Delegeleri sadece bir yöntemin imzasını tanımlayan olarak düşünün!
Bir arabirim ve bir temsilci arasındaki bir diğer büyük fark, sınıfınızı yazarken C # 'a "bu yöntem bu tür bir temsilci uygular" demek zorunda kalmamanızdır. Arabirimlerle, "bu sınıf bu tür bir arabirimi uygular" demeniz gerekir.
Ayrıca, bir temsilci başvurusu (bazı kısıtlamalarla, aşağıya bakın) birden çok yönteme (çağrılan MulticastDelegate
) başvurabilir . Bu, temsilci çağırdığınızda, açıkça eklenmiş birden çok yöntem yürütüleceği anlamına gelir. Bir nesne başvurusu her zaman yalnızca bir nesneye gönderme yapabilir.
Bir yönelik kısıtlamalar MulticastDelegate
(yöntem / temsilci) imza herhangi dönüş değeri (olmaması gerektiğini vardır void
) ve anahtar kelimeler out
ve ref
imza kullanılmamaktadır. Açıkçası, bir sayı döndüren ve aynı sayıyı döndürmelerini bekleyen iki yöntemi çağıramazsınız. İmza uygun olduğunda, temsilci otomatik olarak a MulticastDelegate
.
Etkinlik
Olaylar, yalnızca diğer nesnelerden delege aboneliğini açığa çıkaran özelliklerdir (get; set; özellikler örnek alanlarına özellikler). Ancak bu özellikler get; set; özelliğini desteklemez. Bunun yerine eklemeyi desteklerler; Kaldırmak;
Böylece sahip olabilirsiniz:
Action myField;
public event Action MyProperty
{
add { myField += value; }
remove { myField -= value; }
}
Kullanıcı arayüzünde kullanım (WinForms, WPF, UWP vb.)
Şimdi, bir temsilci bir yönteme referans olduğunu ve dünyaya bize temsilcilerimizden referans alınacak yöntemlerini verebileceklerini bildirecek bir etkinliğe sahip olabileceğimizi biliyoruz ve biz bir UI düğmesiyiz, o zaman: biz tıklanıp tıklanmadığımla ilgilenen herkese yöntemlerini bize kaydettirmelerini isteyebiliriz (maruz kaldığımız etkinlik aracılığıyla). Bize verilen tüm yöntemleri kullanabilir ve temsilcilerimiz tarafından referans gösterebiliriz. Ve sonra, bekleyip bekleyeceğiz .... bir kullanıcı gelip bu düğmeyi tıklayana kadar, temsilci çağırmak için yeterli nedenimiz olacak. Temsilci bize verilen tüm bu yöntemlere atıfta bulunduğundan, tüm bu yöntemler çağrılır. Bu yöntemlerin ne yaptığını veya bu sınıfın hangi sınıfın uygulandığını bilmiyoruz. Tek umursadığımız biri bizi tıklamakla ilgilendiğiydi,
Java
Java gibi delegelere sahip değildir. Bunun yerine arayüzler kullanıyorlar. Bunu yapmanın yolu, 'bizi tıklamakla' ilgilenen herkesten belirli bir arabirimi (arayabileceğimiz belirli bir yöntemle) uygulamalarını istemek, sonra bize arabirimi uygulayan tüm örneği vermektir. Bu arayüzü uygulayan tüm nesnelerin bir listesini tutarız ve tıkladığımızda 'arayabileceğimiz belirli yöntemleri' çağırabiliriz.