iOS – Swift Dersleri (Kalıtım)

Merhaba Arkadaşlar,
Mobilhanem‘deki Swift derslerimize devam ediyoruz. Önceki derslerimizde sınıf ve obje kavramlarına değinmiştik. Bu paylaşımda sınıflar ile ilgili, oldukça sık kullanımı olan kalıtım (inheritance) kavramını anlamaya çalışacağız.

Inherit kelime anlamı olarak kalıtımla kazanmak, miras almak anlamına gelir. Object oriented programlama dillerinde kalıtım (inheritance) bir siniftan aynı özellikleri taşıyan başka bir sınıf üretmek anlamına gelir. Yeni üretilen sınıfa alt sınıf (subclass) yeni sınıfın üretilmesinde kullanılan sınıfa da süper sınıf (superclass) diyoruz. Hiçbir sınıftan üremeyen sınıflara temel sınıf (baseclass) diyoruz.

Aşağıdaki örnekteki temel sınıf Arac sınıfıdır; hiçbir sınıftan türememiştir. tekerlekSayisi ve enFazlaYolcuSayisi adinda iki tane property’e sahiptir. String tipi dönen aracTanimi isminde bir metodu vardır. Obje oluşturulduğunda çalışan bir init metoduna sahiptir.

Overriding

Alt sınıflar türetildikleri süper sınıfların tüm karakteristik özelliklerini taşırlar. Süper sınıfın bütün property, metod vs. özellikleri alt sınıfta da vardır. Bazı durumlarda alt sınıfın bir özelliğini değiştirme, alt sınıfa özel hale getirme ihtiyacı duyulabilir. Bu tür durumlara overriding denir. Aşağıdaki örnekten inceleyecek olursak Arac sınıfının aracTanimi metodu Araba sınıfında override edilmiştir. Artık Araba sınıfının aracTanimi metodu Araba sinifindaki yazildigi halidir. Bu overriding Arac sınıfının (süper sınıf) metoduna etki etmez.

Süper Sınıfın Property, Metod ve Alt scriptlerine ulaşma

super kelimesi ile yapilir:
metodlar için; super.method()
property için; super.someProperty
alt scriptler için; super[someIndex] şeklinde ulaşılır. Burada super kelimesi süper sınıfı ifade eder.

Override’ı önleme

Bir propery, metod veya alt scriptin alt sınıflarda override edilmesini engellemek için final kelimesi kullanılır. Örneğin;
final var, final func, final class func, final subscript

final propery, metod veya alt script override edilmek istendiğinde derleyici hata verecektir (compile-time error).

Aşağıdaki örnekte kalıtım konusu ile ilgili yukarıda işlenen konuların örneklendiği kodu bulabilirsiniz:

class Arac {
    
    //properties
    var tekerlekSayisi: Int
    var enFazlaYolcuSayisi: Int
    
    //metod
    func aracTanimi() -> String {
        return "\(tekerlekSayisi) tekerlekli; \(enFazlaYolcuSayisi) yolcu tasiyabilen bir arac"
    }
    
    //init metodu
    init() {
        tekerlekSayisi = 0
        enFazlaYolcuSayisi = 1
    }
}

//Bisiklet sinifi Arac sinifindan türeyen bir alt siniftir
class Bisiklet: Arac {
    init() {
        //süper sinifin (Arac sinifinin) init metodu cagrilir
        super.init()
        tekerlekSayisi = 2
    }
}

//Tandem sinifi Bisiklet sinifindan türeyen bir alt siniftir
class Tandem: Bisiklet {
    init() {
        //süper sinifin (Bisiklet sinifinin) init metodu cagrilir
        super.init()
        enFazlaYolcuSayisi = 2
    }
}

//Araba sinifi Arac sinifindan türeyen bir alt siniftir
class Araba: Arac {
    var hiz: Double = 0.0
    init() {
        //süper sinifin (Arac sinifinin) init metodu cagrilir
        super.init()
        enFazlaYolcuSayisi = 5
        tekerlekSayisi = 4
    }
    //aracTanimi fonksiyonu override edilmiş.
    override func aracTanimi() -> String {
        return super.aracTanimi() + "; "
            + "\(hiz) mph hizla gidiyor"
    }
}

//Benzer şekilde HizLimitliAraba sinifi Araba sinifindan türeyen bir alt siniftir
class HizLimitliAraba: Araba {
    //property override edilmiş. cagrildi yerden okundugunda get metodu calisir ve oldugu gibi doner. baska bir deger ile set edilmek istenirse set metodu calisir ve min fonksiyonundan donen deger ile set edilir.
    override var hiz: Double  {
    get {
        return super.hiz
    }
    set {
        super.hiz = min(newValue, 40.0)
    }
    }
}

Aşağıdaki gibi test ediyoruz:

//Arac tipinde bir obje yaratilir
var arac = Arac();

println("Aracin tekerlek sayisi: \(arac.tekerlekSayisi)");
println("Aracin tasiyabilecegi yolcu sayisi: \(arac.enFazlaYolcuSayisi)");
        
//Bisiklet tipinde bir obje yaratilir
let bisiklet = Bisiklet()
println("Bisiklet: \(bisiklet.aracTanimi())")
        
//Tandem tipinde bir obje yaratilir
let tandem = Tandem()
println("Tandem: \(tandem.aracTanimi())")
        
//Araba tipinde bir obje yaratilir
let araba = Araba()
println("Araba: \(araba.aracTanimi())")

//HizLimitliAraba tipinde bir obje yaratilir
let hizLimitliAraba = HizLimitliAraba()
println("HizLimitliAraba: \(hizLimitliAraba.aracTanimi())")

//******Çıktı*******//
//Aracin tekerlek sayisi: 0
//Aracin tasiyabilecegi yolcu sayisi: 1
//Bisiklet: 2 tekerlekli; 1 yolcu tasiyabilen bir arac
//Tandem: 2 tekerlekli; 2 yolcu tasiyabilen bir arac
//Araba: 4 tekerlekli; 5 yolcu tasiyabilen bir arac; 0.0 mph hizla gidiyor
//HizLimitliAraba: 4 tekerlekli; 5 yolcu tasiyabilen bir arac; 0.0 mph hizla gidiyor

Bu paylaşımda Swift’te katılım (inheritance) konusunu incelemeye çalıştık. Temel anlamda nasıl kullanıldığını basit örneklerle inceledik. Mobilhanem‘de Swift ile ilgili paylaşımlara devam edeceğiz.

Kaynak: developer.apple.com

iOS – Swift Dersleri (Property List Kullanımı (Plist))

0

Aycan Ayhan

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?