Menu
Coddy logo textTech

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
Woof

Swift 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:

Meow

I 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()) }
challenge icon

Sfida

Facile

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