Swift

继承

本文详细介绍了 Swift 中的继承,包括定义基类、子类生成、重写方法和属性、以及防止重写。

继承是面向对象编程中的一个核心概念。在 Swift 中,类可以从其他类继承方法、属性和其他特性。继承的类称为子类(Subclass),被继承的类称为超类(Superclass)。

注意:在 Swift 中,只有类支持继承,结构体和枚举不支持。

定义基类

不继承于其他类的类,称为基类(Base Class)。

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 什么也不做,因为车辆不一定会有噪音
    }
}

let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
// 打印 "Vehicle: traveling at 0.0 miles per hour"

子类生成

子类生成(Subclassing)是在现有类的基础上创建一个新的类。子类继承了超类的特性,并且可以进行修改或添加新的特性。

class Bicycle: Vehicle {
    var hasBasket = false
}

let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// 打印 "Bicycle: traveling at 15.0 miles per hour"

重写 (Overriding)

子类可以提供其自己的实例方法、类型方法、实例属性、类型属性或下标的自定义实现,这称为重写。使用 override 关键字。

重写方法

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

let train = Train()
train.makeNoise()
// 打印 "Choo Choo"

重写属性

你可以重写继承的实例属性或类型属性,提供自己定制的 getter 和 setter,或者添加属性观察器。

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// 打印 "Car: traveling at 25.0 miles per hour in gear 3"

重写属性观察器

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// 打印 "AutomaticCar: traveling at 35.0 miles per hour in gear 4"

防止重写

你可以通过把方法、属性或下标标记为 final 来防止它们被重写(例如:final varfinal funcfinal class funcfinal subscript)。

如果需要整个类都不能被继承,可以将 final 标记在 class 关键字之前(final class)。

final class FinalVehicle {
    // 这个类不能被继承
}
在 GitHub 上编辑

上次更新于