一个类可以从另一个类继承方法,属性和其他特征。当一个类从另一类继承时,继承的类称为子类,而其继承的类称为其超类。继承是一种基本行为,可将Swift中的类与其他类型区分开。
Swift中的类可以调用和访问属于其超类的方法,属性和下标,并且可以提供这些方法,属性和下标的自己的重写版本以完善或修改其行为。Swift通过检查覆盖定义是否具有匹配的超类定义来帮助确保覆盖是正确的。
类还可以将属性观察器添加到继承的属性中,以便在属性值更改时得到通知。可以将属性观察器添加到任何属性,而不管其最初是定义为存储属性还是计算属性。
定义基类
任何不从另一个类继承的类都称为基类。Swift类不从通用基类继承。您未指定超类而定义的类将自动成为基础类供您构建。
子类化
子类化是在现有类的基础上建立新类的行为。子类继承现有类的特征,然后可以对其进行优化。您还可以向子类添加新的特征。
覆写
子类可以提供其自己的实例方法,类型方法,实例属性,类型属性或下标的自定义实现,否则该实例方法将从超类继承。这称为覆盖。
要覆盖原本会被继承的特征,请在覆盖定义的前面加上override关键字。
访问超类的方法,属性和下标
当您为子类提供方法,属性或下标替代时,将现有的超类实现用作替代的一部分有时会很有用。例如,您可以优化该现有实现的行为,或者将修改后的值存储在现有的继承变量中。
在适当的情况下,您可以使用super前缀访问方法,属性或下标的超类版本:
重写方法someMethod()可以在someMethod()中通过super.someMethod()在重写方法实现中调用来调用的超类版本。
被称为覆盖的属性someProperty可以访问的超类版本someProperty作为super.someProperty压倒一切的getter或setter实现中。
覆盖下标someIndex可以从覆盖下标实现中访问同一下标的超类版本super[someIndex]。
覆盖方法
您可以重写继承的实例或类型方法,以在子类中提供该方法的定制或替代实现。
覆盖属性
您可以覆盖继承的实例或类型属性,以为该属性提供自己的自定义getter和setter,或添加属性观察器以使覆盖的属性能够在基础属性值更改时进行观察。
覆盖属性获取器和设置器
您可以提供一个自定义的getter(如果合适的话,可以使用setter)来覆盖任何继承的属性,而不管该继承的属性是在源上实现为存储属性还是计算属性。子类不知道继承属性的存储或计算性质,它仅知道继承属性具有特定名称和类型。您必须始终声明要覆盖的属性的名称和类型,以使编译器能够检查您的覆盖是否与具有相同名称和类型的超类属性匹配。
通过在子类属性重写中同时提供getter和setter,可以将继承的只读属性表示为读写属性。但是,您不能将继承的读写属性表示为只读属性。
如果在属性替代中提供了一个setter,则还必须为该替代提供一个getter。如果您不想在覆盖的getter中修改继承的属性的值,则可以简单地通过super.someProperty从getter返回值来传递继承的值。
覆盖属性观察者
可以使用属性覆盖将属性观察器添加到继承的属性。这使您可以在继承的属性的值更改时得到通知,而无论该属性最初是如何实现的。
不能将属性观察器添加到继承的常量存储属性或继承的只读计算属性。这些属性的值无法设置,因此不建议在替代中提供willSet或didSet实现。
还要注意,您不能同时为同一属性提供覆盖设置器和覆盖属性观察器。如果您要观察属性值的变化,并且已经在为该属性提供自定义设置器,则可以简单地观察自定义设置器中的任何值更改。
防止被覆盖
您可以通过将方法,属性或下标标记为final来防止其被覆盖。final varfinal funcfinal class funcfinal subscript
尝试覆盖子类中的最终方法,属性或下标的任何尝试都将报告为编译时错误。您添加到扩展中的类的方法,属性或下标也可以在扩展的定义中标记为final。您可以通过在类定义()中final的class关键字之前编写修饰符来将整个类标记为最终类。任何试图将最终类作为子类的尝试都将报告为编译时错误。final class