Sottoclassi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 22 di 57.
L'ereditarietà permette a una classe di basarsi su un'altra. class Dog: Animal rende Dog una sottoclasse della superclasse Animal: un cane ha tutte le proprietà e i metodi di un animale, oltre a ciò che aggiunge Dog:
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())Output:
Rex is an animal
Rex fetches the ballUna sottoclasse che non aggiunge proprietà memorizzate eredita gli inizializzatori della superclasse, ed è per questo che Dog(name:) funziona senza un init in Dog. L'ereditarietà modella una relazione è-un: ogni cane è un animale, quindi un Dog può essere usato ovunque sia previsto un Animal:
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) }Output:
Tom
RexSolo le classi supportano l'ereditarietà; le strutture e le enumerazioni non possono ereditare. Una classe può avere al massimo una superclasse, ma una superclasse può avere molte sottoclassi, formando una gerarchia:
class Vehicle { var wheels = 0 }
class Car: Vehicle { } // Car è un Vehicle
class Bike: Vehicle { } // Bike è un Vehicle
// struct Truck: Vehicle { } // errore: le struct non possono ereditareInserisci nella superclasse ciò che tutte le sottoclassi hanno in comune e in ogni sottoclasse solo le differenze. Quando un tipo non è davvero una sorta dell’altro, l’ereditarietà è lo strumento sbagliato; spesso è meglio una proprietà che contiene l’altro tipo.
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())Output:
a square
9.0Sfida
FacileEmployee memorizza un name e uno salary e ha un metodo raise(by:) che aumenta lo stipendio di una percentuale (arrotondata per difetto). Dichiara una sottoclasse Manager che aggiunge una proprietà memorizzata reports (un array di nomi, inizialmente vuoto) e un metodo addReport(_:), e un metodo teamSize() che restituisce il numero di rapporti.
Il codice fornito crea un manager dalla prima riga (name,salary), aggiunge ogni nome successivo come rapporto, concede un aumento del 10% e stampa Ada earns 5500 and leads 2.
Il tuo codice va in Employee.swift e Manager.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Supplied input/output code: keep it as it is
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())")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift