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
WoofSwift 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:
MeowProtokolle 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()) }Aufgabe
EinfachAnimal 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()) }
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Swift-Playground