Menu
Coddy logo textTech

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 ball

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

Solo 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 ereditare

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

Sfida

Facile

Employee 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())")
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Swift