Sovrascrivere i metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 23 di 57.
Una sottoclasse può sostituire un metodo ereditato con una propria versione. È necessaria la parola chiave override, che impedisce di sostituire accidentalmente un metodo:
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())Output:
Woof
Meow
...super.method() chiama la versione della superclasse dall'interno dell'override, così la sottoclasse può aggiungere funzionalità al comportamento ereditato invece di sostituirlo completamente:
class Report {
func text() -> String { "Sales: 120" }
}
class SignedReport: Report {
override func text() -> String {
super.text() + " (signed by Ada)"
}
}
print(SignedReport().text())Output:
Sales: 120 (signed by Ada)Anche le proprietà calcolate possono essere sovrascritte, con override var:
class Shape {
var sides: Int { 0 }
var summary: String { "\(sides) sides" }
}
class Triangle: Shape {
override var sides: Int { 3 }
}
print(Triangle().summary)Output:
3 sidesL'override viene eseguito anche quando il metodo viene chiamato da codice ereditato: summary riportato sopra è scritto in Shape, eppure usa sides di Triangle. Swift chiama sempre la versione dell'oggetto effettivo, ed è questo che rende utile l'override:
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())Output:
Hello, AdaSfida
FacileNotification ha un metodo render() che restituisce [info] text. Dichiara le sottoclassi Warning, il cui metodo render() restituisce [warn] TEXT (il testo in lettere maiuscole), e Reminder, che aggiunge minutes come valore memorizzato e il cui metodo render() restituisce il risultato della superclasse seguito da (in 10 min), usando super.
Il codice fornito legge righe info,text, warn,text o remind,text,10, crea l'oggetto appropriato in un array di Notification e stampa render() per ciascuno.
Il tuo codice va inserito in Notification.swift, Warning.swift e Reminder.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Supplied input/output code: keep it as it is
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()) }
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift