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