23
Nis'14

OOP 10: Interface Kavramı (C# ile OOP)

Bundan önceki yazımda abstract sınıflardan bahsetmiştim. Şimdi ise abstract sınıfların yakından akrabası olan interfacelerden bahsetmeye çalışacağım. Okuldan mezun olduğumda iş görüşmelerinde karşıma sıkça şu soru çıktı: “Abstract class nedir? Interface nedir? Bu ikisi arasındaki farklar ya da benzerlikler nelerdir?” Bu sorunun ardından biraz boğazımı hafif öksürüklerle konuşmaya hazır hale getirdikten sonra “bildiğim kadarıyla” açıklamaya çalıştım hep. Gelin şimdi o zamanlar bildiğim kadarından biraz daha ileriye gidelim ve boğazımızı ufak öksürüklerle temizleyerek zaman kazanmak yerine, nedir ne değildir anlatalım anlayalım.

 

Interface kelime manası olarak arayüz demektir. Bir arayüzden beklentilerimiz, tabiri caizse asıl yüzeye bir referans sağlamasıdır. Burada asıl yüzeyi class olarak düşünebiliriz. Bir classın bu arayüzü yardımıyla biz o classın yetkinliklerinden kesin olarak haberdar olabilmekteyiz. Nasıl mı? Kural basit. Eğer bir class bir interface tarafından extend edilmiş ise o interface’in zorunlu kıldığı yetkinliklere de sahip olmuş demektir. Mesela foreach ile elemanları arasında bir döngü yapabildiğimiz tüm tipler, IEnumerable interface’inden extend edilmiş olmak zorundalardır. Şimdi daha fazla buraları kurcalamaya gerek yok. Sadece interface isimlendirmesinin “I” ile başladığına dikkat edin. Bu zorunlu olmasa da anlaşılabilirlik açısından güzel bir ayrıntıdır ve interfaceler için genel isimlendirme bu şekildedir.

 

Birkaç kural daha:

– Interfaceler, metod, property, event ve indeksleyiciler barındırabilirler.

– Sadece bir arayüz olduklarından da anlayabileceğimiz gibi, interfaceler elemanlarının gövdelerini barındırmazlar. Sadece tanımları vardır.

– Bir sınıf bir interface tarafından extend edildiğinde o interface’in tüm kurallarına uymak zorundadır. Yani tüm elemanlarını implemente etmek zorundadır.

– Sınıflarda olduğu gibi interfaceler için de tüm erişim belirleyicileri kullanabiliriz.

– Fakat interface elemanları için default erişim belirleyici public’tir. Kendimiz belirlemek istesek de derleyici hata verecektir.

 

Syntax aşağıdaki gibidir:

interface IOrnekInterface
{
    // Metod
    void OrnekMetod();
    // Property
    int OrnekPropery { get; set; }
    // Event
    event EventHandler OrnekEvent;
    // Indexer
    string this[int index]{ get; set; }
}
29
Mar'14

OOP 9: Abstract Kavramı ve Abstract Class (C# ile OOP)

Bu yazımda abstract(sanal) kavramına ve abstract sınıflara değinmeye çalışacağım.

 

Tabiki her şeyden önce böyle bir kavrama neden ihtiyaç duyduğumuzu araştırmak gerekir. Bunun için şimdiye kadar anlattıklarımdan fazlasını içermeyen bir yapı kuralım. Mesela elektronik eşya sınıfı ve bu sınıftan türemiş telefon ve bilgisayar adında iki adet sınıf olsun. İlk ihtiyacımız da bu eşyaların fiyatlarının hesaplanması olsun. Sınıfların içine bu fiyat hesaplama metodlarını da kodlayalım. Sonra ihtiyaçlarımızı biraz daha şekillendireceğiz. Anlatmaya çalıştığım yapının kodları aşağıdaki gibi olacaktır:

class ElektronikEsya
{
    public decimal Alisfiyati { get; set; }
    public decimal KarYuzdesi { get; set; }

    public decimal FiyatHesapla()
    {
        return Alisfiyati + (KarYuzdesi * Alisfiyati);
    }
}

class Telefon: ElektronikEsya { }

class Bilgisayar: ElektronikEsya { }

Main içerisini ise aşağıdaki şekilde kodlayarak telefon ve bilgisayar için fiyat hesaplaması yaptıralım.

static void Main(string[] args)
{
    Telefon telefon = new Telefon() 
    { 
        Alisfiyati = 1100, 
        KarYuzdesi = (decimal)20/100 
    };
    Console.WriteLine("Telefon fiyat: {0}", telefon.FiyatHesapla());

    Bilgisayar bilgisayar = new Bilgisayar() 
    { 
        Alisfiyati = 2000, 
        KarYuzdesi = (decimal)25/100 
    };
    Console.WriteLine("Bilgisayar fiyat: {0}", bilgisayar.FiyatHesapla());
}

Programı çalıştırdığımızda çıktı aşağıdaki gibi olacaktır.

oop9ilkFiyat
Fiyat hesaplama yapabilmek için base classtaki ortak bir metodu kullandık. Her ürün için aynı fiyat hesaplama yöntemi varsa bu iyi bir yol olabilir fakat ürünler için farklı farklı fiyat hesaplama yöntemlerine ihtiyaç duyabiliriz ve tüm ürünler için fiyat hesaplama metodu bir zorunluluk olabilir. Bu durumda base class’taki metodu virtual yapıp child class’ta override edebiliriz ama override etmeme lüksüne de sahibiz:) İstediğimiz, child class’ın bu metodu kullanmaya zorunlu olması. İhtiyacımızı karşılayan anahtar kelime abstract anahtar kelimesidir.

 

Biraz abstract anahtar kelimesinden bahsettikten sonra örneğe devam edebiliriz. Maddeler halinde sıralarsak:

 

– Abstract anahtar kelimesi hem metodlar için hem de classlar için kullanılabilir.

– Bir metodun abstract olarak işaretlenebilmesi için sınıfının da abstract olarak işaretlenmiş olması gerekmektedir.

– Abstract bir sınıf, hem abstract hem de abstract olmayan üyeler içerebilir.

– Abstract metodların gövdeleri ancak child sınıflarda kodlanabilir. Metodların gövdeleri abstract olarak işaretlendikleri abstract sınıflarda kodlanamazlar.

Yeni makaleleri E-Mail ile takip edin!