Menu
Coddy logo textTech

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 ball

Eine 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
Rex

Nur 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 erben

Lege 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.0
challenge icon

Aufgabe

Einfach

Employee 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())")
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