Menu
Coddy logo textTech

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 sides

L'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, Ada
challenge icon

Sfida

Facile

Notification 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()) }
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Swift