İçeriğe geç

Abstract ve Interface Nedir? Farkları nelerdir?

Merhaba arkadaşlar.

Zaman zaman ilk başlarda hepimizin kafasını karıştırdığına eminim bu ikilinin. 🙂 Ne zaman abstract kullanmalıyım, ne zaman interface kullanmalıyım vb. tarzı sorular.

Şimdi gelelim bu ikilinin ne olduklarına.

Bu ikili, nesne yönelimli programlamada (OOP) sınıfları soyutlamaya yarayan yöntemlerden ikisidir. Bu ikisinin ortak oldukları ve farklı oldukları yönler vardır.

Haydi bu yönlere bir göz atalım.

1) Abstract

Yazdığımız sınıflar arasında inheritance(kalıtım) uygularken kullanırız. Alt sınıflar abstract sınıfı inherit alırlar. Abstract class içindeki implement edilmiş tüm method’lar diğer class’da da geçerlidir.

Abstract classdan implement ettiğimiz bir class içerisinde, sadece abstract class içerisinde abstract olarak tanımlanmış method, property gibi vb.lerini implement etmek mecburidir. Diğer method’lar zaten tanımlıdır ve implement edilmesi mecburi değildir.

Abstract sınıflar genelde is-a ilişkilerinde kullanılır.
Örnek vermek gerekirse;

+Ferrari is-a Araba

Ferrari bir arabadır ve arabanın sahip olduğu tüm özelliklere sahiptir.

Hemen bir örnekle pekişmesini sağlayalım.

    abstract class Araba
    {
        public string Marka { get; set; }
        public int VitesSayisi { get; set; }
        // Kısacası arabaların sahip oldukları tüm ortak özellikler

        public abstract void MaximumHiz();
        // Override edilecek methodumuz çünkü her arabanın kendine özgü bir maximum hız bilgisi vardır
    }

    /// <summary>
    /// Ferrari'yi Araba sınıfımızdan inherit alıyoruz.
    /// </summary>
    class Ferrari : Araba
    {
        /// <summary>
        /// Maximum hız bilgimizi override ediyoruz ve Araba abstract sınıfımızın sahip olduğu tüm özelliklere sahip oluyor.
        /// </summary>
        public override void MaximumHiz()
        {
            Console.WriteLine("Ferrari'nin maximum hızı: 300");
        }
    }

Örneğimizden de anlaşılacağı gibi araba örneğimizden yola çıkarak “Araba” isminde bir abstract sınıf oluşturuyoruz ve “Ferrari” bu sınıfdan inherit alarak Arabaların sahip olmuş oldukları tüm ortak özelliklere sahip olmuş oluyor.

NOT: virtual keyi ilede abstract sınıf içerisinde tanımlanmış bir method, alt sınıflar tarafından override (ezilebilir) edilebilir hale getirebilmek mümkündür ve aklımızın bir köşesinde dursun bir class sadece bir abstract class’ı implemente edebilir.

Abstract sınıfın genel özelliklerini sıralayacak olursak;

  1. Kod içerisinde “new” anahtar sözcüğü ile oluşturulamazlar.
  2. Bir sınıf sadece bir abstract sınıfı inherit alabilir.
  3. Inherit alıcak sınıflar arasında genelde “is-a” ilişkisi vardır.
  4. Abstract sınıfda method ve değişkenler tanımlanabilir.

2) Interface

Interface sınıfında sadece method tanımları bulunur. İçlerine kod parçacığı yazılmaz. İçerisinde tanımlanan method tanımları bu interface’i implemente edecek diğer sınıflar tarafından implement edilmesi zorunludur.

Interfaceler başka bir interface den inherit olabilirler.
Interface’ler genelde can-do ilişkisi vardır.

Örnek vermek gerekirse;

+Ferrari can-do drive itself

Ferrari kendi kendini sürebilir (Biraz saçma bir örnek oldu ama) gibi yapabileceği ek özellikler interface olarak tanımlanıp, implemente edilebilir.

Konuyu fazla uzatmadan hemen kaldığımız basit örneğimizle devam edelim:

   /// <summary>
    /// Bazı arabalar cabriolet olabilir hepsinin ortak bir özelliği değildir.
    /// </summary>
    interface ICabrioled
    {
        void TavanTipi();
    }

    abstract class Araba
    {
        public string Marka { get; set; }
        public int VitesSayisi { get; set; }
        // Kısacası arabaların sahip oldukları tüm ortak özellikler

        public abstract void MaximumHiz();
        // Override edilecek methodumuz çünkü her arabanın kendine özgü bir maximum hız bilgisi vardır
    }

    /// <summary>
    /// Ferrari'yi Araba sınıfımızdan inherit alıyoruz ve yeniden şekillendiriyoruz. Ferrarimiz cabriolet ve ICabriolet özelliğini implemente ediyoruz.
    /// </summary>
    class Ferrari : Araba, ICabrioled
    {
        /// <summary>
        /// Maximum hız bilgimizi override ediyoruz ve Araba abstract sınıfımızın sahip olduğu tüm özelliklere sahip oluyor.
        /// </summary>
        public override void MaximumHiz()
        {
            Console.WriteLine("Ferrari'nin maximum hızı: 300");
        }

        /// <summary>
        /// ICabrioled'i implemente ettiğimiz için TavanTipi methodumuzu tanımlıyoruz.
        /// </summary>
        public void TavanTipi()
        {
            Console.WriteLine("Metal tavan");
        }
    }

Örneğimizi basit ve anlaşılır tutmaya çalışırken biraz saçmalamış olabilirim, idare edin. 🙂 Açıklamak gerekirse her aracımız cabriolet olamayacağı için bunu interface olarak tanımlamıştık. “Ferrari” gibi bir aracımızı varsaydık ve buna “ICabrioled” interface’imizi implemente ettik.

Ne demiştik? Interface’ler içerisine kod parçacıkları yazılmaz, sadece method tanımları bulunur. Bunuda gösterebilmek amaçlı sadece “TavanTipi” isminde bir tanımlama yaptık ve “Metal tavan” olarak belirttik.

Interface sınıfının genel özelliklerini sıralayacak olursak;

  1. Kod içerisinde “new” anahtar sözcüğü ile oluşturulamazlar.
  2. Bir sınıf birden fazla interface implemente edebilir.
  3. Implemente edicek sınıflar arasında genelde “can-do” ilişkisi vardır.
  4. Interface içerisine sadece boş method’lar tanımlanabilir.

Gelecek makalelerde görüşmek dileğiyle. 🙂

Kategori:.NETNesne Yönelimli Programlama (Object Oriented Programming)

19 Yorum

  1. Cihan AŞAN Cihan AŞAN

    Teşekkürler güzel anlatım

  2. PythonDeveloper PythonDeveloper

    Helal, Anlatım çok güzel keşke her Makale böyle güzel anlatılsa Devamını Bekliyoruz.

  3. yasin şahan yasin şahan

    çok temiz anlatım ,elinize sağlık.

  4. Cəfərov Cəfərov

    cox gozel izah.tesekkur edirem

  5. Burak Burak

    Ağzınıza sağlık çok güzel bir anlatım olmuş.Abstract class ile inreface class arasındaki farkı çok iyi idrak etmiş oldum.

  6. Erkam Erkam

    Emeğine sağlık, gördüğüm en güzel anlatımlardan.

  7. Durmuş Y. Durmuş Y.

    ” bir class sadece bir abstract class’ı implemente edebilir.” cümledeki sadece kelimesi cümleye farklı anlam yüklemiş
    “abstract tanımlı olduğu class’a bırden fazla abstract tanımlanamaz” gibi bir cümle olması okuyucular için daha anlaşılır olur

    • Teşekkür ederim öneriniz için. Geriye dönüp baktığımda bir çok yazım hatası yaptığımı görüyorum. 🙂 İnsan yaza yaza farkediyor… Dikkate alacağım.

  8. merve alpay merve alpay

    çok güzel anlatmışsınız ellerinize sağlık teşekkürler

  9. emroh emroh

    Çook teşekkürler..

  10. Emre demir Emre demir

    Anlamadığım nokta şu, biz zaten class içinde kullanacağımız interface in method unu tanimlayamazmiyiz, mesela runable adlı interface var içindede run adlı method, runable interface sini animal classina implement ettik, bunun yerine neden animal class inin içinde kendi run methodumuxu oluşturmuyoruz farkı ne?

    • Merhaba, eğer yanlış anlamadı isem cevabım: evet haklısınız, yapabilirsiniz. Ama amacımız, ilgili method’u soyutlayarak, run-time’da, polymorphism’den yararlanabilmek.

  11. Can Can

    Abstract classlarda yer alan “Abstract” ile tanımlanmış (override edilebilen) fonksiyonların/metodların, alt sınıflar tarafından implemente edilme zorunluluğu var mı interfaceler gibi?

    • Merhaba, evet abstract olarak tanımladığınız method’ları implemente etmelisiniz.

  12. mücteba mücteba

    hocam ben bir interface e söyle bir metot tanımlayabiliyorum;
    public int asd(int a)
    {
    return a * 3;
    }
    ama interface tanımlanırken metotların içi boş olmalı bir şart olarak söyleniyor. yani compailer hata verir gibi. ama bu şekilde bir metot tanımladığınızda herhangi bir hata almıyorsunuz. Sebebi nedir?.(bu arada bu tanımladığım metodu (interface i) inherit almış bir classda implement edemiyorum).

    • Merhaba, C# 8 ile birlikte artık interface’deki method’lara default implementation’lar yapılabilmekte.

  13. Ali Ali

    Süper Emeğine sağlık

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.