OneDayOneSwift[13] - Inheritance

一个类可以继承(inherit)另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。

可以为类中继承来的属性添加属性观察器(property observers),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。

重写(Overriding)

子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。

如果要重写某个特性,你需要在重写定义的前面加上override关键字。这么做,你就表明了你是想提供一个重写版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少override关键字的重写都会在编译时被诊断为错误。

override关键字会提醒 Swift 编译器去检查该类的超类(或其中一个父类)是否有匹配重写版本的声明。这个检查可以确保你的重写定义是正确的。

重写属性

你可以重写继承来的实例属性或类型属性,提供自己定制的 getter 和 setter,或添加属性观察器使重写的属性可以观察属性值什么时候发生改变。

重写属性的 Getters 和 Setters

你可以将一个继承来的只读属性重写为一个读写属性,只需要在重写版本的属性里提供 gettersetter 即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。

ps: 如果你在重写属性中提供了 setter,那么你也一定要提供 getter。如果你不想在重写版本中的 getter 里修改继承来的属性值,你可以直接通过super.someProperty来返回继承来的值,其中someProperty是你要重写的属性的名字。

重写属性观察器(Property Observer)

你可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被通知到,无论那个属性原本是如何实现的。

ps:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSetdidSet实现是不恰当。
此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。

防止重写

你可以通过把方法,属性或下标脚本标记为final来防止它们被重写,只需要在声明关键字前加上final修饰符即可.(例如:final varfinal funcfinal class func,以及final subscript)。

你可以通过在关键字class前添加final修饰符(final class)来将整个类标记为 final 的。

要点总结

在属性重写的时候要注意的是:super的只读属性可以被重写成只读和读写而读写属性不能被重写成只读。白话来说就是,在下游可以放宽上游,但不可以缩窄上游。
重写属性,get和set重写后父类的get和set不会再被调用
willSet和didSet重写后父类的willSet和didSet还会继续被调用,而调用属性是先父类后子类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
    无沣阅读 5,272评论 2 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,716评论 19 139
  • 不知道为啥,这个星期看了老师的讲座我脑袋里一直回响着这句话。比如我们追求财富自由,有一个清晰的路线,必须要成为...
    林多多1995阅读 962评论 4 4
  • 小时候,厨艺精湛的妈妈每天会变化着各种花样菜式喂饱我们。自从高中起在外读书之后,我的味蕾和胃口日积月累在重复单一菜...
    燕燕芭比阅读 4,487评论 0 1
  • Alamofire 是一个跨平台的网络框架,由著名的AFNetworking 的作者用Swift 3.0开发完成,...
    CerasusLand阅读 5,086评论 0 1