Swift3.0学习笔记-Inheritance

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

你可能感兴趣的:(Swift基础)