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

被折叠的 条评论
为什么被折叠?



