alttaki classin icindeki void IMemeli.Konus() normal bir metod. ama IMemeli.xyz seklinde olunca buna explicit interface implementation deniyor. bunun yerine public yapilip sadece Konus() da denebilirdi ki buna da implicit interface implementationd deniyor.
ikisinin farki ise implicit olunca classin disindan o metodu normal bir sekilde gorebilirken, explicit olanda sadece elindeki nesneyi o interface'e cast edip erisebiliyorsun
Kedi kedi = new Kedi(); // instantiation. normal sekilde nesne olusturduk kedi.Konus(); // konus metodu implicit ise calisir, explicit ise olmaz. bunun ustesinden ise kedi degiskenini IMemeli'ye cast ederek gelebilirsin
IMemeli memeli = new Kedi(); // instantiation. Kedi turunde nesne olusturup IMemeli turunde bir degiskene atadik. bu durumda C# burada IMemeli'ye ait metodlari ve property'leri gorur, Kedi'ye ait olanlari gormez. gorebilmek icin cast etmen gerekir. memeli.Konus(); // iki durumda da calisir
cast etmek: (tip)degisken veya degisken as tip seklinde cast yapilir. farki: (tip) yapinca eger degisken o tipe cast edilemezse yani o tipte bir nesne degilse InvalidCastException firlatir. as tip seklinde yaparsan eger degisken o tipe cast edilemezse bu sefer bu expression null degerini alir. ornek:
var memeli = (IMemeli)new Kedi(); // sorunsuz calisir var memeli2 = new Kedi() as IMemeli; // bu da ayni sekilde calisir
simdi tamamen baska bir interface olsun IMemeliOlmayan diye: var memeliOlmayan = (IMemeliOlmayan)new Kedi(); // Kedi bu interfaceden olmadigi icin cast basarisiz olur ve exception firlatir. var memeliOlmayan2 = new Kedi() as IMemeliOlmayan; // Kedi bu interfaceden olmadigi icin cast basarisiz olur ve memeliOlmayan2 ifadesi null degerini alir.
(tip) seklinde olani sadece verilen nesnenin o turden oldugundan emin oldugun yerlerde kullan, "as"li olani da diger yerlerde. ve castten sonra o degisken null mi diye kontrol edebilirsin.
---------- resimi direkt anlatmak gerekirse: ilk kisimda "k" isimli Kedi turundeki degiskeni IMemeli'ye cast ediyor, ve IMemeli'ye ait olan Konus() metodunu cagiriyor. (cast etmesi gerekti cunku explicit olarak tanimli o metod Kedi classinda. implicit olsaydi yani normal Konus adli public bir metod olsaydi Kedi turunden cast etmeden de kullanilabilirdi. ayirca, cast etme isleminin bu sekilde parantezle yapilmasi gerekmiyor cunku zaten belli olan bir sey. degisken tanimlama sirasinda IMemeli k = new Kedi(); denseydi cast edilmis halde olacakti. burada iki taraftaki tipler farkli oldugu halde ise yaramasinin sebebi implicit cast edilmis olmasi. (implicit/explicit interface implementation ile implicit/explicit cast farkli seylerdir))
alttaki kisim ise dedigim gibi explicit bir interface metodu, sadece o interface turundeki degiskenler uzerinden erisilebiliyor bu metoda.
buradaki okların çıktıkları yerleri anlaamadım arkadaşlar açıklayabilir misiniz ?
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.