interface'ler, classların sahip olması gereken özellikleri tanımlar. bu interface'ler içerisine kod yazılmaz. özellik ve metotlar belirtilir. örneğin bir class bir interfaceten miras alıyorsa o interface'in tüm metotlarını override etmeli. interface'te bir de ikinci durum var. bu duruma göre interfacelerden virtual classlar gibi object reference oluşturulamaz. bir class multiple interface calling işlemini yapabilir. çünkü c# ve java gibi diller multiple intheritance desteklemez.
Tanımlanırken csharp için diyorum isim olarak hungarian notation'a göre başlarına ı (büyük ı harfi) alarak IFalan gibi şekilde tanımlanırlar. Bu ı harfi bir zorunluluk olmasa da programcıların hungarian notation'a uyması daha iyidir denilir. Yine belirtmek gerekirse interface keywordü ile başlamalı ve public olmalılar.
kullanacağınız yere göre performansta düşüklükler yapar deniliyor. ben demiyorum ancak diyenlerin gerekçelerine göre:
çünkü içerisinde bulunan metotlar dynamic distpatch edilirler. java için dynamic iken c# için static olabilir sanıyorum ki.
hede();
metodunun subclasstan mı yoksa base classtan mı çağırılacağına run time'da karar vereceği için performans kaybı yaşatabilir.
Dynamic Dispatch için bir örnek:
komik ehehe = new komik();
komik höhööh = new komik1();
görüldüğü gibi "höhööh" referans olarak "komik" sınıfını gösterse de initialize edildiği sınıf komik1 olduğu için çok farklı bir çıktı verecektir. işte dynamic dispatch olayı bu olmakta.
10 satırlık hello world uygulaması bu performans testi için kesin sonuç değildir. hatta ölçüt bile değildir. çünkü burada performansı etkileyeceği düşünülen bu 10 satırlık kod değil virtual method table dediğimiz alandır. oraya bir sorgu yapıldığından tepki kontrol edilir.
tabii ki performans yok, performansı düşürüyor demek programcı kalitesine bağlıdır. optimizasyondan geçmiş bir projede interface yavaş çalışıyor demeniz olası değildir. zaten tek derdiniz interface'in performans düşürdüğü iddiası olsun.