ABSTRACT CLASS Nedir? Abstract Class ve Interface arasındaki fark nedir?

Buse Sevindik
4 min readAug 15, 2024

--

Abstract bir sınıfın amacı, ortak bir temel sağlayarak alt sınıfların bu temel üzerine spesifik davranışlar eklemesine olanak tanımaktır.

Peki bu ne demek?

Bunu anlayabilmek için Abstraction (soyutlama) kavramını öğrenerek başlayabiliriz.

Soyutlama, nesne yönelimli programlamanın (OOP) temel ilkelerinden biridir ve sistemin kullanıcılarına ya da diğer parçalarına sadece gerekli olan detayları sunarak karmaşıklığı yönetir. Bunu aslında kullanıcıya bir sınır çizmek için kullanırız. Adından da geldiği gibi aslında bir sorunla karşılaştığımızda o sorunun çözümüne giden adımları öncelikle basitleştirir ve soyutlandırırız. Bu soyutlama sayesinde, bir sistemin iç detayları gizlenir ve sadece dışarıya sunulması gereken işlevsellik gösterilir.

Abstract Sınıflar Nedir?

  • Abstract sınıflar, tam olarak tanımlanmamış (yani, bir veya daha fazla abstract metot içeren) sınıflardır. Bu sınıflar, diğer sınıfların türemesi için bir temel oluşturur ve doğrudan bir örnekleri (instance) oluşturulamaz.
  • Abstract bir sınıfın amacı, ortak bir temel sağlayarak alt sınıfların bu temel üzerine spesifik davranışlar eklemesine olanak tanımaktır.

Neden Abstract Sınıflar Kullanılır?

  1. Ortak Davranışların Paylaşılması: Abstract sınıflar, türetilmiş sınıflar arasında ortak olan davranışları (metotlar ve özellikler) tanımlar. Bu, kodun tekrarını azaltır ve ortak işlevsellik sağlar.
  2. Kısmi Uygulama: Abstract sınıflar, bazı metotların alt sınıflar tarafından tanımlanmasını zorunlu kılarken, diğer metotları veya özellikleri tamamen tanımlayabilir. Bu, esneklik sağlar ve alt sınıfların kendilerine özgü uygulamalarını tanımlamalarına olanak tanır.
  3. Polimorfizm: Abstract sınıflar, polymorphism (çok biçimlilik) yoluyla farklı alt sınıfların aynı abstract sınıf türünde işlenebilmesini sağlar. Bu, kodun daha esnek ve genişletilebilir olmasını sağlar.

Abstract Metotlar

  • Abstract metotlar bir abstract sınıf içinde tanımlanır ve gövdesi (implementation) olmayan metotlardır. Bu metotlar, türetilmiş sınıflar tarafından override edilmek zorundadır.

Neden Override Edilmek Zorunda?

  • Tamamlanmamış Tanım: Abstract metotlar yalnızca bir isim, dönüş türü ve parametreleri tanımlar, ancak bu metotların nasıl çalışacağı türetilmiş sınıflar tarafından belirlenir.
  • Spesifik Uygulama: Farklı alt sınıflar, aynı abstract metodu kendi ihtiyaçlarına göre farklı şekillerde uygulayabilir. Bu, her alt sınıfın kendine özgü bir davranışa sahip olmasını sağlar.
  • Zorunlu Uygulama: Abstract metotlar, alt sınıfların belirli bir işlevselliği uygulamasını zorunlu kılar. Bu, alt sınıfın temel sınıfın tasarımına uygun olarak davranmasını garanti eder.

Bir örnek üzerinden ilerleyecek olursak:

Burada Abstract bir class olarak Animal verilmiş. Ve içerisinde Breathe() adında bir method var. Bu methodu başka classlar kullanmış. Breathe() methodu genel bir methodtur. Çünkü gerçekten tüm hayvanlar nefes alır. Ama MakeSound() methodu hayvandan hayvana değişebilecek bir özellik olduğundan abstract class içerisinde methodun içeriği kullanan classlar tarafından değiştirilebilir şekilde kullanılmıştır. Diğer claslar MakeSound() methodunu override ederek yani ezerek kendine göre işlem yapabilir.

Peki Interface nedir ve Abstract Class ve Interface arasındaki farklar neledir?

Interface, bir sınıfa ne yapması gerektiğini söyler ama nasıl yapacağına karışmaz. Aslında bir rehber görevi görür: “Bu işi yapacaksın!” der, ama nasıl yapacağını tamamen size bırakır. Mesela bir müzik çalarken “oynat,” “duraklat,” “durdur” gibi işlemleri yapmamızı ister, ama bu işlemlerin arka planda nasıl çalışacağını belirlemez. Interface’in içi genelde boş olur, sadece neyin yapılacağını belirtir.

Bu da aslında Interface’in methodlarla arasında “can-do” ilişkisi olmasından kaynaklanır. Can-do ilişkisi bir şeyi yapabileceğini belirtmektir yukarıda açıkladığım gibi.

Mesela müzik çalar örneğinde müzik çalara sen bunu yapabilirsin gibi yapabileceği methodları aslında söylüyoruz. “Çalabilirsin”, “oynatabilirsin.”, “durdurabilirsin.”

Burada SpotifyPlayer sınıfı, IMusicPlayer Interface’ini implement eder ve bu Interface’de tanımlanan işlemleri nasıl yapacağını kendisi belirler. Interface burada bir rehberdir ve sınıfa “Bunları yapabilirsin” der, nasıl yapacağını karışmaz.

Abstract classlarda ise “is-a” ilişkisi vardır. Abstract class base class olduğu için aslında diğer classlara temelde ne olduklarını söylediği ilişkiler kurar.

Örnekle açıklayalım:

Örneğin, bir taşıt (vehicle) sistemi düşünelim. Tüm taşıtların ortak bazı özellikleri vardır: hıza sahip olabilirler, fren yapabilirler. Ama her taşıt türü (örneğin, araba, bisiklet) bu işlemleri farklı şekilde yapabilir.

Burada Car ve Bicycle sınıfları, Vehicle abstract sınıfından miras alır ve “is-a” ilişkisini kurar. Yani, “Araba bir taşıttır” ve “Bisiklet bir taşıttır” diyebiliriz. Bu sınıflar, Vehicle sınıfının sunduğu genel işlevi (fren yapma) kullanabilir ve kendi hızlanma yöntemlerini tanımlayabilir.

Tablolaştırılmış halide altta mevcut.

Abstract ve Interface arasındaki farkların tablosu

Bütün yazıyı özetleyecek olursak Abstract class’lar ve interface’ler, nesne yönelimli programlamada karmaşıklığı yönetmenin yollarıdır. Abstract class’lar, alt sınıflara bir temel sağlar ve “Ne olduğunuzu tanımlarım, ama bazı detayları size bırakırım” der. Verdiğim örnekteki gibi tüm hayvanlar nefes alır ama çıkardıkları sesler farklıdır; bu yüzden nefes alma ortak bir işlev, ses çıkarma ise alt sınıfların tanımlayacağı bir detaydır. Interface’ler ise “Bu işleri yapabilirsin” diyerek rehberlik eder, ama nasıl yapılacağını sınıfa bırakır. Özetle, abstract class’lar “is-a” ilişkisini tanımlarken, interface’ler “can-do” ilişkisini belirtir.

Okuduğunuz için teşekkür ederim.

--

--