1.基类
定义一个基类
任何不从另一个类继承的类都是所谓的基类。(Swift 类不会从一个通用基类继承。你没有指定特定父类的类都会以基类的形式创建。)
2.子类
子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征。
为了表明子类有父类,要把子类写在父类的前面,用冒号分隔:
子类本身也可以被继承。
3.重写
子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
要重写而不是继承一个特征,你需要在你的重写定义前面加上 override关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override关键字的重写都会在编译时被诊断为错误。
override关键字会执行 Swift 编译器检查你重写的类的父类(或者父类的父类)是否有与之匹配的声明来供你重写。这个检查确保你重写的定义是正确的。
访问父类的方法、属性和下标脚本
当你为子类提供了一个方法、属性或者下标脚本时,有时使用现有的父类实现作为你重写的一部分是很有用的。比如说,你可以重新定义现有实现的行为,或者在现有继承的变量中存储一个修改过的值。
你可以通过使用 super前缀访问父类的方法、属性或下标脚本。
重写属性
你可以重写一个继承的实例或类型属性来为你自己的属性提供你自己自定义的 getter 和 setter ,或者添加属性观察器确保当底层属性值改变时来监听重写的属性。
写属性的GETTER和SETTER
你可以提供一个自定义的Getter(和Setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为储属性还是计算属性。继承的属性是存储还是计算属性不对子类透明——它仅仅知道继承的属性有个特定名字和类型。你必须声明你重写的属性名字和类型,以确保编译器可以检查你的重写是否匹配了父类中有相同名字和类型的属性。
你可以通过在你的子类重写里为继承而来的只读属性添加Getter和Setter来把它用作可读写属性。总之,你不能把一个继承而来的可读写属性表示为只读属性。
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear\(gear)"
}
}
重写属性观察器
你可以使用属性重写来为继承的属性添加属性观察器。这就可以让你在继承属性的值改变时得到通知,无论这个属性最初如何实现。关于属性观察器的更多信息,移步属性观察器(此处应有链接)。
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
阻止重写
你可以通过标记为终点来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写
final修饰符
(比如 final var, final func, final class func, final subscript)。
任何在子类里重写终点方法、属性或下标脚本的尝试都会被报告为编译时错误。你在扩展中添加到类的方法、属性或下标脚本也可以在扩展的定义里被标记为终点。
你可以通过在类定义中在 class关键字前面写 final修饰符( final class)标记一整个类为终点。任何想要从终点类创建子类的行为都会被报告一个编译时错误。
网友评论