Menu
Coddy logo textTech

Przesłanianie metod

Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 23 z 57.

Podklasa może zastąpić odziedziczoną metodę własną wersją. Wymagane jest słowo kluczowe override, które zapobiega przypadkowemu zastąpieniu metody:

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

Wynik:

Woof
Meow
...

super.method() wywołuje wersję z nadklasy wewnątrz przesłoniętej metody, dzięki czemu podklasa może rozszerzyć odziedziczone zachowanie zamiast całkowicie je zastępować:

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

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

print(SignedReport().text())

Wynik:

Sales: 120 (signed by Ada)

Właściwości obliczane również można przesłaniać za pomocą override var:

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

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

print(Triangle().summary)

Wynik:

3 sides

Nadpisanie działa nawet wtedy, gdy metoda jest wywoływana z kodu odziedziczonego: summary powyżej jest napisane w Shape, a mimo to używa sides z Triangle. Swift zawsze wywołuje wersję rzeczywistego obiektu, dzięki czemu nadpisywanie jest przydatne:

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

Wynik:

Hello, Ada
challenge icon

Wyzwanie

Łatwy

Notification ma metodę render(), która zwraca [info] text. Zadeklaruj podklasy Warning, której metoda render() zwraca [warn] TEXT (tekst zapisany wielkimi literami), oraz Reminder, która dodaje przechowywaną wartość minutes, a jej metoda render() zwraca wynik nadklasy, po którym następuje (in 10 min), używając super.

Dostarczony kod odczytuje wiersze info,text, warn,text lub remind,text,10, tworzy odpowiedni obiekt w tablicy Notification i wywołuje render() dla każdego z nich.

Twój kod umieść w plikach Notification.swift, Warning.swift i Reminder.swift. main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Swift