Swift3.0学习笔记-Inheritance(继承)


英文文档


派生类可以继承基类的方法、属性和其它特性(例如下标脚本)。 例如:当类B继承于类A时, A就是B的基类、B是A的派生类。 派生类可以调用基类的方法、属性和下标脚本, 也可以覆盖基类的方法、属性、下标脚本。 在使用override关键字覆盖基类属性、方法或下标脚本时, Xcode会自动判断基类是否有相同定义。Swift支持对基类和派生类的属性添加监听器。

      跟C++/Java一样,Swift的类也支持多态。 下面通过一个简单例子说明语法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class FatherClass {  
  2.     var property = 0  
  3.     func showContent() {  
  4.         print("this is FatherClass")  
  5.     }  
  6. }  
  7.   
  8. class SonClass: FatherClass {  
  9.     var msg = "SonClass"  
  10.     override func showContent() { //覆盖要使用override关键字  
  11.         print("this is \(msg)")  
  12.     }  
  13. }  
  14.   
  15. var son = SonClass()  
  16. var father = FatherClass()  
  17. son.showContent()    //多态, 输出"this is SonClass"  
  18. father.showContent()  //输出 “this is FatherClass”  
  19. print("FatherClass property: \(son.property)")  

this is SonClass

this is FatherClass

FatherClass property: 0


说明: Swift跟Java一样只支持单继承, 继承语法如上所示,在派生类后面跟着冒号和基类名称。


override关键字: 在Swift语法中派生类要覆盖基类方法、下标脚本和属性的get/set时,要使用override关键字。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class FatherClass {  
  2.     var property = 0  
  3.     func showContent() {  
  4.         print("this is FatherClass")  
  5.     }  
  6.     subscript() -> Void {  
  7.         print("FatherClass subscript")  
  8.     }  
  9. }  
  10.   
  11. class SonClass: FatherClass {  
  12.     var msg = "SonClass"  
  13.     override func showContent() { //覆盖要使用override关键字  
  14.         print("this is \(msg)")  
  15.     }  
  16.     //override var property: Int //不能覆盖属性!提示 Cannot override with a stored property 'property'  
  17.     override subscript() -> Void {  
  18.         print("SonClass subscript")  
  19.     }  
  20. }  
  21.   
  22. var son = SonClass()  
  23. var father = FatherClass()  
  24. son.showContent()    //多态, 输出"this is SonClass"  
  25. son[]    //输出“SonClass subscript”  
  26. father.showContent()  //输出 “this is FatherClass”  
  27. print("FatherClass property: \(son.property)")  

this is SonClass

SonClass subscript

this is FatherClass

FatherClass property: 0

说明: 不能直接覆盖基类属性,否则Xcode会提示错误;如果需要覆盖基类的属性, 那么可以覆盖set/get方法。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class FatherClass {  
  2.     ...  
  3.     var count: Int {  
  4.         return 10  
  5.     }  
  6. }  
  7.   
  8. class SonClass: FatherClass {  
  9.     ...  
  10.     override var count: Int {  
  11.         return 20  
  12.     }  
  13. }  

print("count value: \(son.count)")

count value: 20


       如果不希望派生类覆盖基类该怎么办?  想想Java/C++的final关键字, Swift同样使用final关键字使得类不能被覆盖。

       包括final var(变量)、final func(方法)、final class func(静态方法)和final subscript(下标脚本)。

        如果不希望有派生类, 跟Java做饭一样将类定义为final class。


继承很简单, 注意几个特点:

1、 只支持单继承, 即最多只有一个父类;

2、支持多态;

3、继承了基类的所有特性,包括属性、方法、下标脚本;

4、在覆盖时必须使用override关键字,不支持直接覆盖属性,只能覆盖属性的get/set方法。

5、支持final关键字,作用同Java。

       总之, 对于Swift的继承特性, 记住单继承、override和final关键字就差不多了, Xcode会有足够的提示引导码农编写正确的语法。


下面举个例子:

(基类ScanViewController是自封装的framework中的类,在工程中继承这个类)













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值