Object Oriented Programming’in (Nesne Tabanlı Programlama) temeli olan inheritence Türkçe çevirisiyle kalıtım, bir türetilen sınıfın özellik ve davranışlarını bir alt sınıfın miras alarak kendi üyesiymiş gibi kullanmasıdır. Kalıtımda, yeni bir sınıfın başka sınıfların fonksiyonellerine sahip olması ve genişlemesidir.

Örneğin, bir geometrik şeklimiz olsun, bu geometrik şeklin en ve boy değerleri verilsin. Aynı anda kare ve dikdörtgen elimizde var olsun. İşte burada, geometrik şeklin en ve boy oranları aynı şekilde kare ve dikdörtgende de var olmaktadır. Burada kare ve dikdörtgen geometrik şekilden inherit edilir, bir başka deyişle miras alınır. İşte bu olaya “Inheritence” ya  da “Kalıtım” denir. Şimdi gelelim bunu Kotlin programlama dilinde nasıl yaptığımıza.

Kotlin’de bir class tanımladığımızda bu otomatik olarak public final olarak tanımlanır nedir bu public ve final? Public, bir erişim belirleyicisidir. Bu erişim belirleyici sınıfın tamamen erişebilir olduğunu gösterir. Peki, final? Final ise, bu sınıfın son hali yani değiştirilemez olduğunu söyler. Biz bir sınıftan miras alırken, miras alınacak sınıfı open olarak belirtmemiz gerekir. Bu open kavramı ile sınıfımızı miras alınabilir hale getiriyoruz. 

open public class GeometrikSekil
{
    var en : Int = 0
    var boy : Int = 0
    
    
    open fun AlanHesapla()
    {
        println("Geoemetrik Şeklin Alanı : " + en*boy)
    }
}

class Kare : GeometrikSekil()
{
    override fun AlanHesapla()
    {
        println("Karenin Alanı : " + en*boy)
    }
}

class Dikdortgen : GeometrikSekil()
{
    override fun AlanHesapla()
    {
        println("Dikdortgenin Alanı : " + en*boy)
    }
}

fun main(args: Array<String>)
{
    var kare : Kare = Kare()
    kare.en = 5
    kare.boy = 5
    kare.AlanHesapla()
    
    var dikDortgen : Dikdortgen = Dikdortgen()
    dikDortgen.en = 7
    dikDortgen.boy = 9
    dikDortgen.AlanHesapla()
}

Burada, dikkat edilirse override anahtar kelimesini kullandık. Nedir bu override ve super kavramları? Override, miras aldığımız sınıftaki metodun tekrar yazılabilmesidir. Yani, bir başka deyişle miras alınan sınıftaki metodun geçersiz kılınmasıdır.  Super anahtar kelimesi de, miras alınan sınıftaki çağırılan metodun en üst sınıfındaki metodu çağırır. 


Kotlin’de Kalıtım yaparken Primary Constructor Nasıl Kullanabiliriz?

Daha önceden constructor (kurucu) metotların tanımını ve kullanımını anlatmıştım, buraya tıklayarak tekrar inceleyebilirsiniz. Şimdi bu işlemi kalıtım yaparken nasıl kullanacağımızı gösterelim.

Bir şirketimiz olsun ve bu şirkette personellerimiz olsun, bu personeller için worker adında, person classından miras alarak bir sınıf oluşturalım ve bunu kalıtım ile gerçekleştirelim.

open class Person(var name:String, var age : Int, var gender:String)
{
    var personName : String
    var personAge : Int
    var personGender : String
    
    init
    {
        this.personName = name
        this.personAge = age
        this.personGender = gender
    }
    
    override fun toString() : String 
    {
        return "Name: $personName Age: $personAge Gender: $personGender"
    }
    /*toString metodunu yeniden override ettik 
bu metot string bir değer döndürür ve biz 
döndürdüğü değeri geçersiz kılıp istediğimiz değeri döndürdük*/
}


class Worker(name:String, age:Int, gender:String, job:String) : Person(name,age,gender)
{
    var job : String
    init
    {
        this.job = job
    }
    
    override fun toString() : String
    {
        return super.toString() + " job: $job"
    }
}

fun main(args: Array<String>)
{
    var person1 : Person = Person("Ali", 23, "Erkek")
    println(person1)
    
    var person2 : Worker = Worker("Ayşe", 32, "Kadın", "Full-Stack Developer")
    println(person2)
}

Burada görüldüğü üzere Person sınıfımız miras alınabilir bir şekilde ve constructor method içeren bir sınıf olarak tanımladık. Burada kafa karıştıran nokta override ettiğimiz “toString()” metodu olabilir. Görüldüğü üzere biz toString metodunu kendi isteğimize göre ayarladık ve istediğimiz şekilde bir değer döndürecek şekilde ayarlandı. Worker sınıfına gelelim, bu sınıfı tanımlarken Person() sınıfından miras aldık, dikkat edilirse miras alırken, constructor method içeren Person sınıfının parametreleri Worker tanımlanırkende yazılmalıdır. Worker sınıfımız ek olarak “job” parametresini de içermektedir. Bu sınıf içinde override ettiğimiz method yine “toString()”, dikkat  edilirse burada “super” anahtar kelimesini kullandık. Super anahtar kelimesi sınıfın tanımlandığı en üst metotta bulunan “toString()” metodundaki değeri döndürür biz buna ek “job” değerini de döndürmesini istedik.  Oldukça karmaşık görünebilir ancak, kalıtımdaki kavramlar tam net öğrenildiğinde bu kavramlar da yerine oturacaktır. Uygulamamız çıktı olarak aşağıdaki sonucu verecektir.

Name: Ali Age: 23 Gender: Man
Name: Ayşe Age: 32 Gender: Woman job: Full-Stack Developer