Menu
Coddy logo textTech

Polymorphismus

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 32 von 57.

Polymorphismus bedeutet, dass ein Stück Code mit Werten verschiedener Typen funktioniert und jeder Wert auf seine eigene Weise reagiert. Die folgende Schleife ruft sound() auf, ohne zu wissen, welches Tier darin enthalten ist:

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

Ausgabe:

Woof
Moo
Woof

Swift entscheidet zur Laufzeit, welche Implementierung ausgeführt wird – anhand des tatsächlichen Objekts. Der deklarierte Typ der Variable spielt keine Rolle; entscheidend ist der Typ des Objekts:

class Animal {
    func sound() -> String { "..." }
}
class Cat: Animal {
    override func sound() -> String { "Meow" }
}

let pet: Animal = Cat()
print(pet.sound())

Ausgabe:

Meow

Protokolle bieten Structs und Enums dieselbe Flexibilität. Hier gibt eine Funktion jede Liste von Drawable-Werten aus:

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)]))

Ausgabe:

--- [ ] -

Polymorphismus ersetzt lange if/switch-Ketten über verschiedene Arten von Dingen. Statt zu fragen, was ein Wert ist, und dann zu entscheiden, was zu tun ist, bittest du den Wert, es zu tun. Eine neue Art hinzuzufügen bedeutet, einen neuen Typ hinzuzufügen, nicht jeden switch zu bearbeiten:

// ohne Polymorphismus
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }

// mit Polymorphismus
for animal in farm { print(animal.sound()) }
challenge icon

Aufgabe

Einfach

Animal hat name, legs() (4) und describe(), das Rex has 4 legs and says Woof zurückgibt und aus legs() und sound() erstellt wird. Deklariere Dog (Sound Woof), Bird (2 Beine, Sound Tweet) und Snake (0 Beine, Sound Hiss), indem du nur legs() und sound() überschreibst.

Der bereitgestellte Code liest die Zeilen dog,Rex, bird,Pip oder snake,Kaa, speichert die Tiere in einem einzigen [Animal]-Array und gibt für jedes describe() aus.

Dein Code gehört in Animal.swift, Dog.swift, Bird.swift und Snake.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

// Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground