Swift3.0学习笔记-Inheritance

本文介绍了Swift中的继承特性,包括派生类如何继承基类的方法、属性和下标,以及如何覆盖这些特性。同时,文章提到了Swift支持单继承、多态,并强调在覆盖时必须使用`override`关键字。还介绍了`final`关键字用于防止派生和覆盖。总结了继承的几个关键点:单继承、多态、`override`和`final`的使用。

https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID193


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

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

class FatherClass {
    var property = 0
    func showContent() {
        print("this is FatherClass")
    }
}

class SonClass: FatherClass {
    var msg = "SonClass"
    override func showContent() { //覆盖要使用override关键字
        print("this is \(msg)")
    }
}

var son = SonClass()
var father = FatherClass()
son.showContent()    //多态, 输出"this is SonClass"
father.showContent()  //输出 “this is FatherClass”
print("FatherClass property: \(son.property)")

this is SonClass

this is FatherClass

FatherClass property: 0


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


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

class FatherClass {
    var property = 0
    func showContent() {
        print("this is FatherClass")
    }
    subscript() -> Void {
        print("FatherClass subscript")
    }
}

class SonClass: FatherClass {
    var msg = "SonClass"
    override func showContent() { //覆盖要使用override关键字
        print("this is \(msg)")
    }
    //override var property: Int //不能覆盖属性!提示 Cannot override with a stored property 'property'
    override subscript() -> Void {
        print("SonClass subscript")
    }
}

var son = SonClass()
var father = FatherClass()
son.showContent()    //多态, 输出"this is SonClass"
son[]    //输出“SonClass subscript”
father.showContent()  //输出 “this is FatherClass”
print("FatherClass property: \(son.property)")

this is SonClass

SonClass subscript

this is FatherClass

FatherClass property: 0

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


class FatherClass {
    ...
    var count: Int {
        return 10
    }
}

class SonClass: FatherClass {
    ...
    override var count: Int {
        return 20
    }
}

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会有足够的提示引导码农编写正确的语法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值