在Swift中实现继承
2021-12-24 本文已影响0人
一个栗
定义基类
- 任何不从另一个类继承的类都是所谓的基类
- Swift 类不会从一个通用的基类继承。你没有指定特定父类的类都会以基类的形式创建。
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
子类
- 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义他们。你也可以为子类添加新的特征。
- 为了表明子类有父类,要把子类写在父类的前面,用冒号分隔。
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
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
重写
- 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承,这就是所谓的重写。
- 要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。
访问父类的方法、属性和下标脚本
- 你可以通过使用 super 前缀访问父类的方法、属性或下标脚本
重写方法
- 可以在子类中重写一个继承的实力或类型方法来提供定制的或替代的方法实现。
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
class Train: Vehicle {
override func makeNoise() {
print("呜呜~")
}
}
let train = Train()
train.makeNoise()
重写属性的 getter 和 setter
- 可以提供一个自定义的 getter (和 setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为储属性还是计算属性。
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
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("Cat:\(car.description)")
执行结果如下:
Cat:traveling at 25.0 miles per hourin 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 hourin gear 4
防止重写
- 可以通过标记为 final 来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写 final 修饰符(比如final var,final func,final class func , final subscript)