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