Menu
Coddy logo textTech

Metotları Geçersiz Kılma

Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 57.

Bir alt sınıf, miras aldığı bir yöntemi kendi sürümüyle değiştirebilir. Yanlışlıkla bir yöntemi değiştirmeyi önlemek için override anahtar sözcüğü gereklidir:

class Animal {
    func sound() -> String { "..." }
}

class Dog: Animal {
    override func sound() -> String { "Woof" }
}

class Cat: Animal {
    override func sound() -> String { "Meow" }
}

print(Dog().sound())
print(Cat().sound())
print(Animal().sound())

Çıktı:

Woof
Meow
...

super.method(), override içinden üst sınıf sürümünü çağırır; böylece alt sınıf, miras alınan davranışın tamamını değiştirmek yerine ona ekleme yapabilir:

class Report {
    func text() -> String { "Sales: 120" }
}

class SignedReport: Report {
    override func text() -> String {
        super.text() + " (signed by Ada)"
    }
}

print(SignedReport().text())

Çıktı:

Sales: 120 (signed by Ada)

Hesaplanan özellikler de override var ile geçersiz kılınabilir:

class Shape {
    var sides: Int { 0 }
    var summary: String { "\(sides) sides" }
}

class Triangle: Shape {
    override var sides: Int { 3 }
}

print(Triangle().summary)

Çıktı:

3 sides

Geçersiz kılma, yöntem miras alınan koddan çağrıldığında bile çalışır: Yukarıdaki summary, Shape içinde yazılmıştır, ancak Triangle'ın sides özelliğini kullanır. Swift her zaman gerçek nesnenin sürümünü çağırır; geçersiz kılmayı kullanışlı kılan da budur:

class Greeter {
    func name() -> String { "someone" }
    func greet() -> String { "Hello, \(name())" }
}

class AdaGreeter: Greeter {
    override func name() -> String { "Ada" }
}

let g: Greeter = AdaGreeter()
print(g.greet())

Çıktı:

Hello, Ada
challenge icon

Görev

Kolay

Notification sınıfının [info] text döndüren bir render() metodu vardır. render() metodu [warn] TEXT döndüren (metni büyük harflerle yazan) Warning alt sınıfını ve saklanan bir minutes ekleyen, render() metodu üst sınıfın sonucunun ardından (in 10 min) döndüren Reminder alt sınıfını tanımlayın; bunun için super kullanın.

Verilen kod info,text, warn,text veya remind,text,10 satırlarını okur, Notification dizisi içinde uygun nesneyi oluşturur ve her biri için render() çıktısını yazdırır.

Kodunuz Notification.swift, Warning.swift ve Reminder.swift dosyalarına yazılmalıdır. main.swift verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var input: [String] = []
while let line = readLine() { input.append(line) }
var all: [Notification] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "warn": all.append(Warning(text: p[1]))
    case "remind":
        let r = Reminder(text: p[1])
        r.minutes = Int(p[2])!
        all.append(r)
    default: all.append(Notification(text: p[1]))
    }
}
for n in all { print(n.render()) }
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Swift playground