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 sidesNadpisanie 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, AdaWyzwanie
ŁatwyNotification 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()) }
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift