13.继承
一个类可以继承另一个类的方法、属性和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。
在 Swift 中,类可以调用和访问超类的方法、属性和下标,并且可以重写(override)这些方法、属性和下标来优化或修改它们的行为。
1.定义一个基类:不继承于其它类的类,称之为基类
- Swift 中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。这点和OC不同,OC中有一个超类NSObject。
class SomeSuperclass { //这里是基类的定义 }
2.子类生成:为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔
- 子类生成指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以进一步完善。
class SomeClass: SomeSuperclass { //这里是子类的定义 }
3.重写:如果要重写某个特性,必须在重写定义的前面加上override关键字。
- 子类可以为继承来的实例方法、类方法、实例属性、或下标提供自己定制的实现。
【说明】:在合适的地方,可以通过使用super
前缀来访问超类版本的方法,属性或下标:
- 在方法
someMethod()
的重写实现中,可以通过super.someMethod()
来调用超类版本的someMethod()
方法。 - 在属性
someProperty
的 getter 或 setter 的重写实现中,可以通过super.someProperty
来访问超类版本的someProperty
属性。 - 在下标的重写实现中,可以通过
super[someIndex]
来访问超类版本中的相同下标。
class SuperClass { var iTemp = 0; func temp() { print("SuperClass"); } //使用关键字class的类方法可以被重写 class func testCanOverride() { print("SuperClass testCanOverride"); } //使用关键字static的类方法不可以被重写 static func testCanNotOverride() { print("SuperClass testCanNotOverride"); } } class ChildrenClass: SuperClass { // override var iTemp = 3; //错误:子类重写必须为计算属性 override var iTemp: Int { get { return 3; } set { self.iTemp = newValue; } } override func temp() { print("ChildrenClass"); } override class func testCanOverride() { super.testCanOverride(); //先打印父类的对应方法 print("ChildrenClass testCanOverride"); } } ChildrenClass.testCanOverride();
【注意】:
- 类方法是使用关键字class修饰的方法(子类可以重写),也可以使用static修饰(子类不可以重写),这时子类就不能重写。static相当于class+final的作用
- 子类可以将父类的存储属性和计算属性进行重写,子类重写必须为计算属性(提供getter和setter)
- 子类可以将只读属性重写为可读写的(提供getter和setter),但是不能将父类的读写属性重写为只读属性(只提供getter)
- 不能对一个父类let修饰的存储属性在子类中进行重写。因为常量在定义时就被赋值。
4.防止重写
- 可以通过把方法,属性或下标标记为final来防止它们被重写,只需要在声明关键字前加上final修饰符即可(例如:final var,final func,final class func,以及final subscript);
- 在关键字class前添加final修饰符(final class)来将整个类标记为 final 的。这样的类是不可被继承的,试图继承这样的类会导致编译报错
无善无恶心之体,
有善有恶意之动,
知善知恶是良知,
为善去恶是格物。