1、定义基类
- 任何不从另一个类继承的类都是所谓的基类。
- Swift 类不会从一个通用基类继承。没有指定特定父类的类都会以基类的形式创建。
class Vehicle { //此时 Vehicle 类不从任何类继承,它是一个基类
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
print("呜呜呜呜呜...")
}
}
2、子类
- 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征。
- 为了表明子类有父类,要把子类写在父类的前面,用冒号分隔。
class Vehicle { //此时 Vehicle 类不从任何类继承,它是一个基类
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
print("呜呜呜呜呜...")
}
}
class Bicycle: Vehicle { // Bicycle 类从 Vehicle 类继承
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0 //直接调用父类属性 setter 方法为属性赋值
print("bicycle: \(bicycle.description)")
3、重写
- 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
- 要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明提供了一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行 为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。
- 使用 super 前缀访问父类的方法、属性和下标脚本
//重写方法
class Train: Vehicle {
override func makeNoise() { //重写父类的方法
print("呼呜, 呼呜...")
super.currentSpeed = 180.0 //使用 super 关键字来访问 父类的属性
print(super.description)
}
}
let train = Train()
train.makeNoise()
1> 重写属性的 getter 和 setter
- 可以提供一个自定义的 getter (和 setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为储属性还是计算属性。
class Car: Vehicle {
var gear = 1
override var description: String { //重写了计算属性的 getter 方法
return super.description + "in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
2> 重写属性的观察器
- 使用属性重写来为继承的属性添加属性观察器。就可以在继承属性的值改变时得到通知。无论这个属性最初如何实现。
- 不能给继承而来的常量存储属性和只读的计算属性添加属性观察器。
- 不能为同一个属性同时提供重写的 setter 和重写的属性观察器
//重写属性的观察器
class AutomiticCar: Car {
override var currentSpeed: Double { //重写父类的存储属性
didSet { //重写父类存储属性的观察器
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automiticCar = AutomiticCar()
automiticCar.currentSpeed = 35.0
print("automitic: \(automiticCar.description)")
3> 阻止重写
- 通过标记为 final 来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下 标脚本的关键字前写 final 修饰符(比如 final var , final func , final class func , final subscript )
class Vehicle { //此时 Vehicle 类不从任何类继承,它是一个基类
var currentSpeed = 0.0
final var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
print("呜呜呜呜呜...")
}
}
class Car: Vehicle {
// override var description: String {
// return "" //此时报错,显示这个属性已经被 final 修饰了,不能被重写了
// }
override func makeNoise() {
print("啦啦啦啦啦...")
}
}