Polimorfismo
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 32 di 57.
Polimorfismo significa che una porzione di codice funziona con valori di molti tipi e che ogni valore risponde a modo suo. Il ciclo qui sotto chiama sound() senza sapere quale animale contiene:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cow: Animal {
override func sound() -> String { "Moo" }
}
let farm: [Animal] = [Dog(), Cow(), Dog()]
for a in farm { print(a.sound()) }Output:
Woof
Moo
WoofSwift decide quale implementazione eseguire durante l'esecuzione, in base all'oggetto effettivo. Il tipo dichiarato della variabile non conta; conta il tipo dell'oggetto:
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())Output:
MeowI protocolli offrono la stessa flessibilità a struct ed enum. Qui una funzione stampa qualsiasi elenco di valori Drawable:
protocol Drawable {
func draw() -> String
}
struct Line: Drawable {
let length: Int
func draw() -> String { String(repeating: "-", count: length) }
}
struct Box: Drawable {
func draw() -> String { "[ ]" }
}
func render(_ items: [any Drawable]) -> String {
items.map { $0.draw() }.joined(separator: " ")
}
print(render([Line(length: 3), Box(), Line(length: 1)]))Output:
--- [ ] -Il polimorfismo sostituisce lunghe catene di if/switch sui tipi di oggetti. Invece di chiederti che cosa sia un valore e poi decidere cosa fare, chiedi al valore di farlo. Aggiungere un nuovo tipo significa aggiungere un nuovo tipo, non modificare ogni switch:
// senza polimorfismo
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// con polimorfismo
for animal in farm { print(animal.sound()) }Sfida
FacileAnimal ha name, legs() (4) e describe(), che restituisce Rex has 4 legs and says Woof, costruito a partire da legs() e sound(). Dichiara Dog (suono Woof), Bird (2 zampe, suono Tweet) e Snake (0 zampe, suono Hiss) sovrascrivendo solo legs() e sound().
Il codice fornito legge righe dog,Rex, bird,Pip o snake,Kaa, memorizza gli animali in un unico array [Animal] e stampa describe() per ciascuno.
Il tuo codice va in Animal.swift, Dog.swift, Bird.swift e Snake.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Codice di input/output fornito: lascialo così com'è
var input: [String] = []
while let line = readLine() { input.append(line) }
var zoo: [Animal] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "dog": zoo.append(Dog(name: p[1]))
case "bird": zoo.append(Bird(name: p[1]))
default: zoo.append(Snake(name: p[1]))
}
}
for a in zoo { print(a.describe()) }
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