定义基类

<aside> 🦄 Swift 的类不需要继承一个通用的基类。

</aside>

重写

重写方法

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
    
    class func overrideableFunc() {
        print("SomeClass")
    }
}

class SomeSubClass: SomeClass {
    override class var overrideableComputedTypeProperty: Int {
        return 108
    }
    
    override class func overrideableFunc() {
        super.overrideableFunc()
        print("SomeSubClass")
    }
}

class SomeSubClass2: SomeSubClass {
    override static var overrideableComputedTypeProperty: Int {
        return 109
    }
    override static func overrideableFunc() {
        super.overrideableFunc()
        print("SomeSubClass2")
    }
}

print(SomeSubClass2.overrideableComputedTypeProperty)

SomeSubClass2.overrideableFunc()

重写属性&属性观器

<aside> 💤 只读属性可以重写为读写属性,反之不可。

</aside>

<aside> 🍫 如果重写属性的 setter,那么也必须实现 getter,即使没有修改。

</aside>

<aside> 👩🏼‍💻 不能给继承的常量存储属性或只读计算属性添加属性观察器。

</aside>

<aside> 🤶🏻 同样的,也不能给同一个属性既添加属性观察器,又重写其 setter 方法,如果要对该属性的改变进行观察,直接在 setter 方法中做就可以了。

</aside>

class Vehicle {
    var currentSpeed = 0.0
    var name = "Vehicle"
    var description: String {
        return "traveling at \\(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 什么也不做——因为车辆不一定会有噪音
    }
}
class Car: Vehicle {
    var gear = 1
    override var currentSpeed: Double {
        // 写了 setter 也必须写 getter
        get {
            super.currentSpeed
        }
        // 不能不写 setter 方法,只读属性可以重写为读写属性,反之不可。
        set {

        }
    }
    override var description: String {
        return super.description + " in gear \\(gear)"
    }
}
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
        // 不能给同一个属性既添加属性观察器,又重写其 setter 方法。
//        set {
//            currentSpeed = newValue
//        }
    }
    override var description: String {
        name = "AutomaticCar"
        return "\\(name) " + super.description
    }
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \\(automatic.description)")
// 打印“AutomaticCar: traveling at 35.0 miles per hour in gear 4”

防止重写

<aside> 🥑 使用 final 标记防止重写,对属性、方法、下标都可,对类进行标记则可防止对整个类的重写。

</aside>