Unterklassen
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 22 von 57.
Vererbung ermöglicht es einer Klasse, auf einer anderen aufzubauen. class Dog: Animal macht Dog zu einer Unterklasse der Oberklasse Animal: Ein Hund hat jede Eigenschaft und Methode eines Tieres sowie alles, was Dog hinzufügt:
class Animal {
var name: String
init(name: String) { self.name = name }
func describe() -> String { "\(name) is an animal" }
}
class Dog: Animal {
func fetch() -> String { "\(name) fetches the ball" }
}
let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())Ausgabe:
Rex is an animal
Rex fetches the ballEine Unterklasse, die keine gespeicherten Eigenschaften hinzufügt, erbt die Initialisierer der Oberklasse. Deshalb funktioniert Dog(name:) ohne ein init in Dog. Vererbung bildet eine Ist-eine-Beziehung ab: Jeder Hund ist ein Tier, daher kann ein Dog überall dort verwendet werden, wo ein Animal erwartet wird:
class Animal {
var name: String
init(name: String) { self.name = name }
}
class Cat: Animal {}
class Dog: Animal {}
let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }Ausgabe:
Tom
RexNur Klassen unterstützen Vererbung; Strukturen und Aufzählungen können nicht erben. Eine Klasse hat höchstens eine Oberklasse, aber eine Oberklasse kann viele Unterklassen haben, wodurch eine Hierarchie entsteht:
class Vehicle { var wheels = 0 }
class Car: Vehicle { } // Car ist ein Vehicle
class Bike: Vehicle { } // Bike ist ein Vehicle
// struct Truck: Vehicle { } // Fehler: Structs können nicht erbenLege alles, was alle Unterklassen gemeinsam haben, in die Oberklasse und nur die Unterschiede in die jeweilige Unterklasse. Wenn ein Typ nicht wirklich eine Art des anderen ist, ist Vererbung das falsche Werkzeug; eine Eigenschaft, die den anderen Typ enthält, passt oft besser.
class Shape {
var name: String
init(name: String) { self.name = name }
func label() -> String { "a \(name)" }
}
class Square: Shape {
var side = 1.0
func area() -> Double { side * side }
}
let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())Ausgabe:
a square
9.0Aufgabe
EinfachEmployee speichert einen name und ein salary und verfügt über eine Methode raise(by:), die das Gehalt um einen Prozentsatz erhöht (abgerundet). Deklariere eine Unterklasse Manager, die eine gespeicherte Eigenschaft reports (ein zunächst leeres Array mit Namen) und eine Methode addReport(_:) sowie eine Methode teamSize() hinzufügt, die die Anzahl der Berichte zurückgibt.
Der bereitgestellte Code erstellt aus der ersten Zeile (name,salary) einen Manager, fügt jeden folgenden Namen als Bericht hinzu, gewährt eine Gehaltserhöhung von 10 % und gibt Ada earns 5500 and leads 2 aus.
Dein Code gehört in Employee.swift und Manager.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
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