Polimorfizm
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 32 z 57.
Polimorfizm oznacza, że jeden fragment kodu działa z wartościami wielu typów, a każda wartość reaguje na swój sposób. Poniższa pętla wywołuje sound(), nie wiedząc, którego zwierzęcia dotyczy:
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()) }Wynik:
Woof
Moo
WoofSwift decyduje, którą implementację uruchomić w czasie wykonywania, na podstawie rzeczywistego obiektu. Zadeklarowany typ zmiennej nie ma znaczenia; znaczenie ma typ obiektu:
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())Wynik:
MeowProtokoły zapewniają taką samą elastyczność strukturom i wyliczeniom. Oto jedna funkcja, która wyświetla dowolną listę wartości 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)]))Wynik:
--- [ ] -Polimorfizm zastępuje długie łańcuchy if/switch dotyczące różnych rodzajów obiektów. Zamiast pytać, czym jest dana wartość, a potem decydować, co zrobić, prosisz ją, żeby sama to zrobiła. Dodanie nowego rodzaju oznacza dodanie nowego typu, a nie edytowanie każdego switch:
// bez polimorfizmu
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// z polimorfizmem
for animal in farm { print(animal.sound()) }Wyzwanie
ŁatwyAnimal ma name, legs() (4) oraz describe(), które zwraca Rex has 4 legs and says Woof, utworzone na podstawie legs() i sound(). Zdefiniuj Dog (dźwięk Woof), Bird (2 nogi, dźwięk Tweet) i Snake (0 nóg, dźwięk Hiss), nadpisując tylko legs() i sound().
Dostarczony kod odczytuje wiersze dog,Rex, bird,Pip lub snake,Kaa, przechowuje zwierzęta w jednej tablicy [Animal] i wypisuje describe() dla każdego z nich.
Umieść swój kod w plikach Animal.swift, Dog.swift, Bird.swift i Snake.swift. main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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()) }
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift