Abstract Class vs Interface

Buse DEMİR
3 min readJun 10, 2022

--

Herkese Merhabalar 🌸

Bugün fazlaca tartışılan ve belki bir çok mülakatta karşımıza çıkan bir konuyu ele almak istedim. İki yapıya da bakıldığı zaman aynı gözükse de aslında belirli farklıları olduğunu yazımızda belirteceğiz.

Object Oriented programlamada sınıfların soyutlanmasını Abstract Class ve Interface ikilisi sağlamaktadır. Object Oriented programlama ile ilgili genel bilgilere ulaşmak için aşağıda belirtmiş olduğum yazıma davetlisiniz..

Soyutlama (Abstractıon) kavramını bir hatırlamamız gerekirse , büyük bir yapıda sistemin tüm detaylarına odaklanmak yerine input ve outputlarına bakmak sistemi daha net anlamamıza olanak sağlar. Soyutlama , kısaca Seçilen temel özelliklerin karmaşıklıklarının ve fonksiyonelliklerin arka planlarının göz ardı edilerek sunulmasıdır. Bir soyut sınıf oluşturularak birden fazla iş yükünü kalıtım alarak çözebiliriz.

  • Abstract, tüm classlarda kullanılacak yapıları içerirken Interface’ler nitelik bazlıdır. Bu yüzden spesifik bir özellik içeriliyorsa bu yapıyı Interface’lerde tanımlamalıyız. Şablon yapıları kurgularken de Abstract class’ları tercih etmeliyiz.

Abstract Class

  • Abstract class , soyut sınıf oluşturabilme yeteneğine denir. Soyut sınıf obje oluşturamayacağımız bir sınıfdır.
  • Bir sınıfı abstract yapmak için abstract keywordünü kullanırız.
  • Abstract sınıfların bir instance oluşturamayız.
  • Bir class sadece bir abstract class implement edebilir.
  • Abstract class -genel olarak- ancak bir sınıftan inheritance alabilir. Veya bir sınıf -genel olarak- ancak bir abstract sınıftan inheritance alabilir.
  • Abstract class “is-a” özelliğine sahiptir. Sınıfın neyden türediğini ifade edebilir.

is-a ilişkisi : Kısaca bahsetmek gerekirse , Yılan-Sürüngen ilişkisini ele alabiliriz. Yılan bir sürüngendir ve sürüngenin sahip olduğu tüm özellikleri taşır. Burdan yola çıkarak

Sürüngen = Abstract Class

Yılan = Sürüngen sınıfından kalıtım alarak bu sınıfa ait olan tüm özellikleri barındırır.

  • Ortak sınıf davranışı için abstract class kullanılmalıdır.
  • Abstract class, nesnenin ne yapması gerektiğini belirlemek ile beraber nasıl yapması gerektiğini de belirleyebilir.
  • Abstract class yapıcı metodlar(constructor) içerir.
  • Abstract class içindeki implement edilmiş tüm method’lar diğer class’da da geçerlidir.
  • Abstract classlar içerisinde hem boş metotlar hemde dolu metotlar tanımlanabilir.
  • Farklı tiplerde erişim belirleyiciler içerebilir.
  • Constructor içerebilir.

Minik örnek ile bakarsak ; Oluşturduğumuz abstract sınıfına gerekli constructorı vererek özellikler ile soyut sınıfımızı oluşturduk. Bu abstract sınıfı artık Enginner classına dahil ederek , Person soyut sınıfımızın özelliklerine sahip olduğunu belirttik. Bu sayede Person içerisinde 20 adet fonksiyonumuzda olsa biz istediğimiz sınıfa bunu iki nokta ile dahil edebiliyoruz.

fun main(args: Array<String>) {
val user = Engineer("Buse Demir")
user.displayJob("Computer Engineering")
user.personAge(25)
}
abstract class Person(name: String) {
init {
println("Name : $name")
}

fun personAge(age: Int) {
println("Age : $age")
}


abstract fun displayJob(description: String)
}
class Engineer(name: String): Person(name) {
override fun displayJob(description: String) {
println("Description : $description")
}
}

Interface

  • Sınıflar birden fazla sınıftan kalıtım alamazlar. Ancak INTERFACE bu sorunu ortadan kaldırır ve bu sayede sınıflar birden fazla kalıtım alabilirler.
  • Interfaceler den objeler türetilemez.
  • Interfaceler genelde “can-do” ilişkisine göre çalışır.

can-do ilişkisi : Kısaca bahsetmek gerekirse , Yılan-Isırmak ilişkisini ele alabiliriz. Yılanlar ısırabilir yani yılanın bir davranışından,yeteneğinden bahsetmiş oluyoruz. Can — do ilişkisi de davranışları yetenekleri belirler. İnterface de içerisinde bir kod yazılmadan hazır yanlızca method tanımları bulundurduğu için bir davranışı ya da yeteneği belirtmek burada daha anlamlı olacaktır.

  • Interface içerisinde tüm erişim belirleyiciler kullanılmaz. Her şey public olarak kabul edilir.
  • Interfaceler yanlız bir class değillerdir. Arayüz soyut classlarıdır.
  • Interfaceler bir sınıfda birden fazla inherit olarak alabilirler.
  • Interface içerisinde boş metot tanımlanamaz.
  • Interface çoklu kalıtım desteklemektedir.
  • Interface bir sınıfın ne yapması gerektiğini belirtir, nasıl yapması gerektiğini belirtmez.
  • Interface yapıcı metodlar(constructor) içermez.

Minik bir örneğe bakarsak ; Interface in en büyük avantajı olan birden fazla kalıtım alabilme özelliğini kullanarak iceceğin özelliklerini interface yardımıyla kullanılabilmesini göstermiş olduk.

interface Icecek {
val name:String
fun aroma(meal: String)
}
interface Sicaklik {
fun soguk()
fun sicak()
}
class Ozellik : Icecek,Sicaklik {
override val name: String = "Limonata"
override fun aroma(meal: String) {
println("$name aroması $meal")
}
override fun soguk() {
println("$name soguk bir icecektir")
}
override fun sicak() {
println("$name sıcak bir icecektir")
}
}
fun main(args: Array<String>) {
val icecek=Ozellik()
println(icecek.name)
icecek.aroma("Limon")
icecek.soguk()
}

Kaynakça

Keyifli okumalaar 🌸🌸

--

--

Buse DEMİR

Hello, my name is Buse. I am a computer engineer. ❤️Love Android and Kotlin❤️. Just live..