Abstract vs İnterface

Abstract vs İnterface

Nesne yönelimli programlamada bir sınıfa bir yetenek, davranış kazandırılmak isteniyorsa interface, birden fazla sınıf ortak metot kullanacaksa abstract sınıf kullanımı yaygındır. Bu yazıda, abstract ve interface’in detaylarına değineceğiz.
Elif Koç04 Ara 2022

Soyutlama yapabilmek için nesneye yönelik programlamada iki yöntem mevcuttur; interface ve abstract. Soyutlama kavram olarak sınıfın içindeki işleyişini dışarıya kapamaktır. Örneğin, atmde işlem yaparken kullanıcıların atmnin işleyişinden bilgisi olmaz. Kullanıcılar, metodları veya akışı arayüz sayesinde çağırarak kullanır. Kartın doğrulanması, hesap bilgilerinin kontrolü, yapılacak işleme göre yeterli bakiye bulunup bulunmadığının hesaplanması gibi metotların işleyişinden kullanıcı haberdar olmaz. Bu işleyişe müdahale edilemez. Nesneye yönelik programlamada da sınıflar oluşturulurken bazı metotların işleyişinin sadece bulunduğu sınıf tarafından bilinmesi gerektiği durumlar olabilir.

Abstraction

Abstraction implementasyon ayrıntılarını kullanıcıdan gizler. Abstract (soyut) kavramı yalnızca sınıflar ve metotlar ile kullanılır, değişkenler için kullanılmaz. Herhangi bir metodu abstract olarak tanımlarsak, o metodun görevinin/uygulamasının (implementation) ilgili sınıfın alt sınıfında olması gerekir, çünkü abstract metotlar hiçbir zaman implementasyondan bahsetmez. 

Interface

Interface, sınıflara ait metotların sadece imzalarının bulunduğu, implementasyonlarının bulunmadığı bir yapıdır. Interface içerisinde sadece soyut metotlar tanımlanabilir. Eğer bir sınıf interface’den miras alırsa, interface’de tanımlanmış olan her bir soyut özelliği de (metotları da) miras alması gerekir. Miras alan sınıf, interface’de bulunan bir veya daha fazla metoda ihtiyaç duymuyorsa yazılımın tasarımsal açıdan bir sorunu var demektir. Bu sorun, interface’lerin alt interface’lere bölünmesiyle yani Interface Segregation ile çözülebilir. 

 

Abstract (soyut) sınıfların özellikleri

  • Abstract anahtar kelimesi ile tanımlanır.
  • Soyut sınıfların içerisinde soyut olan veya soyut olmayan metotlar tanımlanabilir.
  • Soyut bir sınıf constructor’a ve static fonksiyonlara sahip olabilir.
  • Bir sınıftan nesne yaratmak istenmiyorsa o sınıf soyutlanabilir.
  • Abstract olan parent sınıf, child sınıflara ait ortak metodları ve özellikleri taşıyabilir.

 

Sınıf isimlendirmesinde abstract kullanımı

Abstract sınıflarda genel olarak, metodların interface’ler gibi tanımı yoktur. Abstract bir sınıfın çocuğu, ebeveynin abstarct metodlarını geçersiz kılmalıdır (override), aksi halde çocuk da abstract olarak kabul edilir. Override; alt sınıfın, üst sınıfında tanımlanmış bir metot için farklı implementasyon sağlamasına imkan yaratan nesne yönelimli programlama özelliğidir. Alt sınıftaki geçersiz kılınan metot, üst sınıftaki metot ile aynı ada, imzaya ve parametrelere sahip olmalıdır. 

Burada dikkat edilmesi gereken nokta; abstract sınıflardan üretilmiş sınıfların abstract metotların implementasyonunu yapması zorunludur. Diğer metotları override etmeden de kullanabilir.

Abstract metotlar inherit (miras) edilebilir, statik ve finak olarak tanımlanamaz. Üst sınıfın metodunun final olarak tanımlanması durumunda alt sınıfta bu metot geçesiz kılınamaz. Bunun nedeni uygulanmasının (implemantation) nihai oluşudur ve bir sınıfın final olarak ilan edilmesiyle o sınıfın fonksyionalitesi genişletilmezi yani yaratılamaz.

Abstract sınıfların özelliklerini incelemeye devam edelim:

  • Abstract bir üst sınıftan genişletilmiş (extended) soyut olmayan bir alt sınıfta, tüm abstract metotlar implement edilmelidir. Görsel 2’de bunun örneği görülebilir.
  • Abstract sınıftan bir nesne oluşturulamaz:
  • Abstract bir sınıf, new operatörü kullanılarak somutlaştırılamaz. 
  • Alt sınıfların contructor’larında üst sınıfların constructor’larını çağırırız. Örneğin, GeometricObject constructor’ları (default veya parametreli) Circle ve Rectangle sınıflarındaki constructor’lar tarafından çağrılır.
     

 

Interface’lere geçmeden önce is-a ilişkisini inceleyelim. Toyota is a car (Toyota bir arabadır). Toyota bir arabadır ve arabanın sahip olduğu özelliklere sahiptir. Abstraction yapısını kullanarak, araba sınıfındaki özellikleri tekrar yazmadan Toyota sınıfında kullanabiliriz. Burada dikkat edilmesi gereken abstract bir sınıf olan araba sınıfında bulunan metodu, Toyota sınıfında implemente ederken (yani metodun gövdesini yazarken) override edilmesi gerekliliğidir.  

 

Interface (arayüz) 

Bir interface, bir sınıfın uygulayacağı bir dizi metot oluşturur. Arayüzdeki metotların hiçbirine tanım (metodun tamamı yazılmaz) verilmez. Bir sınıf birden fazla interface tanımlayabilir. Bir sınıf birden fazla interface’i implement edebilir. Interface isimleri implements kelimesi ile belirtilir. Sınıf, başlıkta listelenen interfacelerdeki tüm metotları uygulamalıdır.
 


 

Interface’lerin kullanılma sebeplerindne bazıları aşağıdaki gibi sıralanabilir:

  • Bir interface, abstract bir sınıfa benzer ancak bir interfacelerin amacı, nesneler için davranış belirlemektir.
  • Çoklu kalıtımı (multiple inheritance) destekler.
  • Abstract sınıflarında olduğu gibi new operatörüyle bir interfaceden örnek (nesne) oluşturulamaz. 

 

Interfaces abstract ise şu şekilde karşılaştırılabilir:

  • Bir interface’de veri alanları sabit olmalıdır. Abstract sınıfta ise değişken veri alanları olabilir. 
  • Interface’lerin constructor’ları yoktur. Tüm abstract sınıfların constructor’ı vardır. 
  • Bir interface’deki her metodun, implementasyonu olmaksızın imzası vardır, abstract bir sınıfın ise somut metotları (implentasyonu bulunan) olabilir.

 

Abstract ve interface konularını ele alırken sıklıkla karşılaştığımız extend ve implement anahtar kelimelerini inceleyelim.

Extend ve İmplement farkları

 

Extend

Bir sınıfın alanlarını ve metotlarını, extend anahtar sözcüğünü kullanarak miras alabiliriz. Java’da bir sınıf en fazla bir sınıfı extend edebilir.

 

Implement

Java’da bir interface’i implement edebilmek (metodun işlevini belirtmek) için implement anahtar sözcüğünü kullanırız. Interface yalnızca soyut metodlar uygulayan bir sınıf türüdür. Interface metotlarına erişmek için, interface’in başka bir sınıf tarafından implements anahtar sözcüğü ile implement edilmesi ve metotların, interface’in özelliklerini miras alan sınıfta uygulanması gerekir. Bir interfacede metodlar implement edilmediği için, bir sınıf aynı anda herhangi bir sayıda interface uygulayabilir.

 

 

Extends ve implements’in farklarını inceleyelim:

 

Class ve interface ilişkisinde aşağıdaki şekilde gösterildiği gibi, bir sınıf başka bir sınıfı extend edebilir. Bir interface başka bir interface’i extend edebilir. 

 

Abstract sınıflar ve interface’lerin farkına göz atmadan önce can-do ilişkisini de inceleyelim: Bu ilişki, yetenekleri ve davranışları belirtmektedir. Örneğin, Ferrari can do accelerate (Ferrari hızlanabilir). Is-a ve can-do ilişkileri bize hangi durumda Interface hangi durumda Abstract kullanacağımız hakkında yol gösterir.
 

 

Peki nesne oluşturmamıza rağmen neden abstract sınıf içerisinde constructor’a sahip olabiliyoruz? Abstract sınıftan nesne oluşturamayız, ancak soyut sınıfın alt sınıfından bir nesne oluşturabiliriz. Soyut bir sınıfın alt sınıfının bir nesnesini oluşturduğumuzda, alt sınıfın constructor’ını çağırır. Bu alt sınıf oluşturucu, ilk satırda bir abstract sınıfın constructor’ını çağıran super anahtar kelimesine sahiptir. Abstract sınıfın constructor’ı yoksa, o abstract sınıfı genişleten bir sınıf derlenmeyecektir.
 

Özetle nesneye yönelik programlamada, sınıflar ile inheritance yapısını kullanırken bazı metotların içeriğini değiştirmek isteyebiliriz veya parent sınıfta tanımladığımız metot, child sınıfların ihtiyacını karşılamıyor olabilir. Bu durumlarda soyut sınıfları kullanmak avantaj sağlar. Aslında soyut sınıflarda amaç, şablon kullanmaktır. Soyut sınıfta tanımlanan bu şablon, bu sınıfı miras alan child sınıflarda override edilerek yeniden tanımlanır. 

 

Kaynaklar

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.