Inheritance
Single inheritance only. Use protocols for shared behavior across unrelated types.
override is required. final prevents overriding/subclassing. super accesses the parent implementation.
class Vehicle {
var currentSpeed = 0.0
var description: String { "traveling at \(currentSpeed) km/h" }
func makeNoise() {}
}
class Bicycle: Vehicle {
var hasBasket = false
}
class Car: Vehicle {
var gear = 1
override var description: String { super.description + " in gear \(gear)" }
override func makeNoise() { print("Vroom") }
}
class SportsCar: Car {
override var currentSpeed: Double {
didSet { gear = Int(currentSpeed / 30) + 1 } // overriding property observers
}
final override func makeNoise() { print("VROOOM") } // can't be overridden further
}
let vehicles: [Vehicle] = [Bicycle(), Car(), SportsCar()]
for v in vehicles { v.makeNoise() } // dynamic dispatch