interface ve abstract class nedir? arasındaki farklar?

Bu yazımda size interface ve abstract class arasındaki farklardan ve kullanılma şeklinden bahsedeceğim. Bu iki kavramı yazılımla ilgilen hemen hemen herkes duymuştur ama kullanım açısından ne işe yaradığını veya nerde kullanılması gerektiğini pek bilen yoktur. Bu iki kavram hem mülakatlarda sık sık karşınıza çıkacaktır hem de kullanmayı öğrendikten sonra işinizi daha kısa sürede yapmanızı sağlayacaktır.

 

ABSTRACT CLASS (SOYUT SINIF)

  1. Tasarımı zarif hale getiriyor.
  2. Teknik tanımı en az bir tane soyut yöntem içeren sınıftır.
  3. Soyut yöntem demek alt sınıfta tekrar tanımlanması zorunlu yöntem demektir.
  4. Eğer bir sınıf üst sınıfın yöntemlerinden birini bile içermiyorsa o sınıfta soyut olur.
  5. Değişkenler soyut olamaz ancak yöntemler soyut olur.
  6. Soyut sınıflarda asla kod yazılmaz. Sadece yöntemin imzası kullanılır.
  7. Soyut bir sınıfın yapıcı tanımlı olsa bile asla nesnesini yaratamayız. Diğer bir deyişle soyut bir sınıf asla bir nesnenin gerçek tipi değildir.

Soyut bir sınıfın alt sınıfı;

  • Üst sınıfın bütün abstract yöntemlerini tanımlayabilir, bu durumda artık bu alt sınıf soyut sınıf değildir.
  • Ona miras kalan abstract yöntemlerinin en az birini bile tanımlamazsa oda soyuttur.

INTERFACE (ARAYÜZ)

  1. Bir arayüz içinde hiçbir özellik bulundurmaz. İçerisinde değişken olmaz.
  2. Bir arayüz sadece soyut yöntemler bulundurur. Soyut sınıflar gibidir. Ama sınıf değildir.
  3. Java da bir alt sınıfın birden fazla üst sınıfı olamıyor ancak bir sınıfın birden fazla uyguladığı arayüzü olabilir.
  4. Arayüzler değişken tanımında kullanılabilen bildirim tipleridir.
  5. Çoklu arayüz uygulama çoklu kalıtımdan (multiple inheritance) farklı, çünkü kod mirası kalmıyor. Ancak bir arayüz kalıtım ile (extends) başka arayüzlerden türetilebilir.
  6. Bir arayüzün alt arayüzü olabilir. Üst arayüzden, alt arayüze tüm yöntem bildirimleri miras kalır.

 

ARALARINDAKİ FARKLAR?

extends’ten sonra sadece bir sınıf olur. implements’ten sonra istediğimiz kadar arayüz olur.
Abstract; kendisinden yeni bir nesne yaratılmayacak ancak başka sınıfların superclassı olarak kullanılabilecek. Interface; bir işi gerçekleştirecek tüm sınıfların aynı metod tanımlarını içermesini sağlayacak.

  • Interfaceler çoklu kalıtımı sağlamaya yardımcı, Abstract classlar ise çoklu kalıtımı desteklemez.
  • Interfacelerde metodların içerisini dolduramayız ama Abstract classlarda doldurabiliriz. Böylece bütün alt sınıfların belli bir özelliğe sahip olmasını sağlayabiliriz.
  • Interface ile yapabildiğimiz herşeyi hatta daha fazlasını abstract classlar ile de yapabiliriz.
  • Türeteceğimiz classlarda belli başlı varsayılan özellikleri tekrar tekrar kopyala-yapıştır yapmak istemiyorsak o zaman abstract class kullanmamız gerekir. Çünkü abstract classlarla bir metodu tüm alt classlarda varsayılan metod şeklinde tanımlayabiliriz ve alt classlarda bunları tekrar yazmamıza gerek kalmaz kalıtımla aktarılmış olur.
  • Kalıtım sağlamak istiyorsak abstract classlar kullanmamız gerekir.
  • Abstract classları kullanmak hız açısından avantaj sağlar.
  • Interface de yeni bir metod yazdığımız zaman bu interfaceden implement ettiğimiz tüm classlarda bu metodun içini tek tek doldurmak gerekiyor ancak abstract classlarda durum farklıdır burada bir metod tanımlayıp içini doldurduğumuzda abstract sınıfımızdan türetilmiş bütün sınıflar bu özelliği kazanmış olur.