- 区分【类】和其他类型的一个特征:继承
- 子类 继承 超类(父类)的属性、方法和下标。
- 可调用、重写父类的方法、属性和下标
- 为父类添加属性观察器(存储属性和计算属性都可以)
定义一个基类
- 基类:不继承其他类
与 OC 相比,Swift 类不默认继承基类
没有指定父类,都是基类
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 什么也不做——因为车辆不一定会有噪音
}
}
let someVehicle = Vehicle()
- 访问它的
description
属性来打印车辆的当前速度:
print("Vehicle: \(someVehicle.description)")
// 打印“Vehicle: traveling at 0.0 miles per hour”
子类生成
- 指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:
class SomeClass: SomeSuperclass {
// 这里是子类的定义
}
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
- 修改继承的
currentSpeed
属性
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// 打印“Bicycle: traveling at 15.0 miles per hour”
- 创建了一个名为
Tandem
(双人自行车)的子类
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// 打印:“Tandem: traveling at 22.0 miles per hour”
重写
重写:子类可以为继承来的实例方法,类方法,实例属性,类属性,或下标提供自己定制的实现
重写(非继承)定义前面加上 override 关键字(不写关键字会报错)
override 会查找父类是否有重写的属性、方法等
访问超类的方法,属性及下标
- 重写时,可多调用父类方法实现
- 使用
super
前缀来访问超类版本的方法,属性或下标:- 方法重写:通过
super.someMethod()
来调用超类版本的someMethod()
方法 - 属性的 getter 、setter 的重写:
super.someProperty
来访问超类someProperty
属性 - 下标重写:通过
super[someIndex]
来访问超类版本中的相同下标
- 方法重写:通过
重写方法
- 可重写方法类型:实例方法、类型方法
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// 打印“Choo Choo”
重写属性
- 可重写的属性类型:存储属性、计算属性
- 重写属性-应用场景:
- 自定义 getter + setter 方法实现
- 添加属性观察器
重写属性的 Getters 和 Setters
- 重写声明:属性名 + 类型
- 只读属性 可重写为 读写属性(同时提供 getter + setter 即可)
- 读写属性 不可重写为 只读属性
重写属性的增加 setter,也必须 提供 getter方法
不想改变父类getter,可通过
super.someProperty
来返回继承来的值
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”
重写属性观察器
- 无法添加属性观察器:
- 常量 的存储属性(常量无法修改)
- 只读计算属性 (只读不能写入)
- 不可同时提供 setter + 属性观察器 (只需在 setter 内部监听即可)
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
- 属性观察器将新的速度值除以
10
,然后向下取得最接近的整数值,最后加1
来得到档位gear
的值。例如,速度为35.0
时,档位为4
:
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// 打印“AutomaticCar: traveling at 35.0 miles per hour in gear 4”
防止重写
- 防重写,但可继承
- 在声明关键字前加上
final
修饰符 - 例如:
final var
、final func
、final class func
以及final subscript
- 在声明关键字前加上
- 类拓展也可使用 final 标记
- 防止继承
- 在关键字
class
前添加final
修饰符(final class
)来将整个类标记为 final ·
- 在关键字