C# Interface Nedir?
Interface kullanımı sınıflarla benzerlik gösteren ama bir sınıf gibi davranmayan hatta bir sınıf olmayan yapılardır. Interface'i arayüz yani şablon olarak düşünebiliriz. Peki Interface olayı nedir, neden böyle bir şeye ihtiyaç duyulmuş?
Interface'ler öncelikle kod üzerinde soyutlama yapmamızı sağlar. Şimdi diyebilirsiniz ki soyutlama yani abstraction nedir? En basit şekilde soyutlamayı açıklamam gerekirse, bir bilgisayar düşünün, bir kişi bu bilgisayarı sadece power tuşuna basarak çalıştırabilir. Ancak onun arkasında ne gibi olaylar oluyor hiçbir fikri yok zaten olmasına da gerek yok bir kullanıcı olarak. Onun yapması gereken tek şey sadece o power tuşuna basmaktır. İşte soyutlama da böyle bir şey bir anlamda olayı olabildiğince basitleştirme ve arkaplanda dönen işleri saklamak diyebiliriz.
Interface'lerin bir diğer varolma sebebi ise sınıflardaki miras işleminin sınırlı olması. Bir sınıf sadece bir tane sınıftan miras yani kalıtım alabiliyor. Başka bir sınıftan daha kalıtım alma imkanı yok. Ancak bir sınıfa birden fazla sayıda interface implement edilebilir. Burası önemli çünkü Interface'lerden kalıtım alınmaz yani inherit edilmezler, implement edilirler.
C#'ta interface'in avantajlarını şöyle sıralayabiliriz:
- Interface sayesinde kod içerisinde plug-and-play yani tak ve çalıştır yöntemi etkinleştirilmiş olur. Şöyle düşünelim iki tane sınıfımız olsun firstClass ve secondClass diye. Bu sınıflara bir tane IFoo adında bir interface implement edilmiş. Sonrasında bu bir tane system olarak çalışacak bir sınıfımız olsun. Ona da FooSystem sınıf diyelim. Bu sistem sınıfında nesneleri yöneteceğiz. FooSystem sınıfında run adında bir fonksiyonumuz ve bu fonksiyon IFoo tipinde parametre alsın. firstClass ile üretilmiş nesneyi de, secondClass ile üretilmiş nesneyi de bu run methoduna gönderebiliriz. Çünkü Interface bir referans tiptir. Bir interface implement edildiği tüm sınıflardan üretilen nesnelerin referanslarını alabilir. Yani her iki farklı tipteki nesneyi run metodunda kullanabiliriz. Eğer sonrasında farklı bir nesne kullanımı gerekirse o nesnenin (thirdClass)sınıfına Interface implement edilip sonrasında nesnenin kendisi run metoduna rahatlıkla gönderilebilir. Zaten buradaki plug-and-play olayın kasıt budur. Tekrar o sınıf tipi için ekstra bir metot yazmamıza gerek yok FooSystem sınıfına.
- Kod içerisinde büyük oranda soyutlama sağlanır.
- Loose Coupling kullanımı sağlanmış olur. Bu kavramı bir sistemin parçalarının birbirinden olabildiğince bağımsız olacak şekilde çalışması olarak açıklayabiliriz. Bir parçanın çalışmaması veya düzgün çalışmadığı halde diğer parçanın doğru şekilde çalışmasına engel olmaması loose coupling olarak açıklanabilir. Wikipedia sayfasından bu kavram hakkında daha çok bilgi edinebiliriz.
- Kod içerisindeki karmaşıklığı önemli derecede azaltmaktadır ve kod okunabilirliği açısından oldukça işlevseldir.
- Yukarıda belirttiğimiz gibi bir sınıfın çoklu kalıtım alabilmesine bir bakımdan imkan vermektedir, tabi implement olarak.
Interface'de sadece metot ve property bildiriminde bulunuruz. Yani bunların sadece signature olarak interface içerisinde bildirebiliriz. Bunlar bizim soyut olarak metot veya property bildirimlerimizdir. Implement edildiği sınıf içinde mutlaka bu bildirimlerin gövde kodu yazılmalıdır. Ayrıca interface içinde tanımladığımız signature yani imzalar access modifiers yani erişim belirteçleri kullanılarak bildirilmezler. Direkt olarak int topla(); veya void say(); gibi yazılır. Zaten default olarak bu bildirimlerin erişim belirteci public'tir. Bir diğer bilinmesi gereken önemli husus ise interface'lerden nesne üretilemeyeceğidir. Kısacası interface'ler bir sınıf olmadığı için kendilerinden nesne üretilemez.
Genelde interface tanımlanırken interface isminin ilk harfi I olacak şekilde yazılır. Bu genel kabul görmüş bir kullanımdır. Kod okurken onun bir interface olduğunu anlamamızı sağlar. (Örnek: IDeneme)
Hiç yorum yok: