- 任何不从另一个类继承的类都是所谓的基类
- Swift 类不会从一个通用基类继承。你没有指定特定父类的类都会以基类的形式创建。
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 bicy = Bicycle()
bicy.hasBasket = true
bicy.currentSpeed = 15.0
print("Bicycle: \(bicy.description)")
- 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就是所谓的重写
- 要重新而不是继承得一个特征,你需要在你的重写定义前面加上 override 光健字。这样做说明你打算提供一个重写而不是意外提供了一个相同的定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误
- 你可以通过使用 super 浅醉访问父类的方法、属性和下标脚本
- 一个命名为 someMethod() 的重写方法可以通过 super.someMethod() 在重写方法的实现中调用父类的版本的 someMethod() 方法
- 一个命名为 someProperty 的重写属性可以通过 super.someProperty 在重写的getter 或 setter 实现中访问父类版本的 someProperty 属性
- 一个命名为 someIndex 的重写下标脚本可以使用 super[someIndex] 在重写的下标脚本实现中访问父类版本相同的下标脚本
- 可以在子类中重写一个集成的实例或者类型方法来提供定制的或替代的方法实现
class Train: Vehicle {
override func makeNoise() {
print("呜呼 呜呼")
}
}
let ain = Train()
ain.makeNoise()
- 可以提供一个自定义的 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)")
- 可以使用属性重写来为继承的属性添加属性观察器。这就可以让你在继承属性的值改变时得到通知,无论这个属性最初如何实现
- 不能给继承而来的常量存储属性或者只读的计算属性添加属性观察期。这些属性的值不能被设置,所以提供 willSet 和 didSet 实现作为重写的一部分也是不合适的。
- 不能为同一属性同时提供重写的 setter 和重写的属性观察器。如果你想要监听属性值的改变,并且你已经为那个属性提供了一个自定义的 setter, 那么你从自定义的 setter 里就可以监听任意值的改变。
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)")
- 可以通过标记为 final 来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者小标脚本的关键字前些 final 修饰符(比如 final var, final func, final class func, final subscript)
网友评论