Menu
Coddy logo textTech

Methoden überschreiben

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 23 von 57.

Eine Unterklasse kann eine geerbte Methode durch ihre eigene Version ersetzen. Das Schlüsselwort override ist erforderlich und verhindert, dass eine Methode versehentlich ersetzt wird:

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())

Ausgabe:

Woof
Meow
...

super.method() ruft innerhalb der Überschreibung die Version der Oberklasse auf, sodass die Unterklasse das geerbte Verhalten erweitern kann, anstatt es vollständig zu ersetzen:

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

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

print(SignedReport().text())

Ausgabe:

Sales: 120 (signed by Ada)

Berechnete Eigenschaften können ebenfalls überschrieben werden, mit override var:

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

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

print(Triangle().summary)

Ausgabe:

3 sides

Die Überschreibung wird auch dann ausgeführt, wenn die Methode aus geerbtem Code aufgerufen wird: Das oben genannte summary ist in Shape geschrieben, verwendet jedoch die sides von Triangle. Swift ruft immer die Version des tatsächlichen Objekts auf, und genau das macht Überschreibungen nützlich:

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())

Ausgabe:

Hello, Ada
challenge icon

Aufgabe

Einfach

Notification verfügt über eine Methode render(), die [info] text zurückgibt. Deklariere die Unterklassen Warning, deren render() [warn] TEXT zurückgibt (den Text in Großbuchstaben), und Reminder, die ein gespeichertes minutes hinzufügt und deren render() das Ergebnis der Oberklasse gefolgt von (in 10 min) zurückgibt, wobei super verwendet wird.

Der bereitgestellte Code liest Zeilen im Format info,text, warn,text oder remind,text,10, erstellt das passende Objekt in einem Array von Notification und gibt für jedes Objekt render() aus.

Dein Code gehört in Notification.swift, Warning.swift und Reminder.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

// Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground