取大于形態(tài)的能力被定義為繼承。一般一個(gè)類可以從另一個(gè)類繼承屬性和方法。類可以進(jìn)一步劃分到子類和超類。
子類:當(dāng)一個(gè)類從另一個(gè)類繼承屬性,方法和功能被稱為子類
超類:類包含屬性,方法和功能被其它類繼承稱為超類
Swift 中類包含父類和調(diào)用訪問方法,屬性,功能和重寫方法。另外,屬性觀察者也用于添加屬性和修改所存儲(chǔ)的或計(jì)算的特性的方法。
基類
一個(gè)類如果不從其它類繼承方法,屬性或功能,那么它被稱為“基類”。
classStudDetails{var stname:String!var mark1:Int!var mark2:Int!var mark3:Int!
init(stname:String, mark1:Int, mark2:Int, mark3:Int){self.stname = stname
self.mark1 = mark1
self.mark2 = mark2
self.mark3 = mark3
}}let stname ="swift"let mark1 =98let mark2 =89let mark3 =76
println(stname)
println(mark1)
println(mark2)
println(mark3)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
swift988976
這里 StudDetails 類被定義為基類,它用于包含學(xué)生名字和三個(gè)科目標(biāo)記為:mark1, mark2 和 mark3. 'let'關(guān)鍵字在 playground 中初始化并使用 “println” 函數(shù)打印顯示基礎(chǔ)類的值。
子類
在現(xiàn)有的基類上定義一個(gè)新的類就叫作“子類”。子類繼承了其基類的屬性,方法和功能。要定義一個(gè)子類使用 “ : ” 在基類名稱前。
classStudDetails{var mark1:Int;var mark2:Int;
init(stm1:Int, results stm2:Int){
mark1 = stm1;
mark2 = stm2;}
func print(){
println("Mark1:/(mark1), Mark2:/(mark2)")}}class display :StudDetails{
init(){super.init(stm1:93, results:89)}}let marksobtained = display()
marksobtained.print()
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
Mark1:93, Mark2:89
“StudDetails” 類定義為學(xué)生標(biāo)記聲明的超類以及子類的 'display' 從它的超類繼承以打的標(biāo)記。子類定義學(xué)生標(biāo)記和調(diào)用打印方法來顯示學(xué)生的標(biāo)志。
覆蓋/重寫
訪問超類的實(shí)例,類型方法,例如,類型屬性和下標(biāo)子類提供覆蓋的概念。 'override' 關(guān)鍵字用來覆蓋超類中聲明的方法。
訪問超級(jí)類的方法,屬性和下標(biāo)
“super”關(guān)鍵字作為前綴用來訪問超類中聲明的方法,屬性和下標(biāo)。
方法和屬性覆蓋 方法覆蓋
繼承實(shí)例和類型的方法可以通過 'override' 關(guān)鍵字覆蓋在子類中定義的方法。在這里,在子類中重寫打印來訪問超類打印type屬性。
class cricket {
func print(){
println("Welcome to Swift Super Class")}}class tennis: cricket {override func print(){
println("Welcome to Swift Sub Class")}}let cricinstance = cricket()
cricinstance.print()let tennisinstance = tennis()
tennisinstance.print()
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
Welcome to Swift Super ClassWelcome to Swift Sub Class
屬性重寫
可以覆蓋繼承的實(shí)例或類屬性來提供自定義的getter和setter 屬性,或添加屬性觀察者,當(dāng)下層屬性值更改時(shí)以使重寫屬性到觀察者。
重寫屬性getter和setter
Swift 允許用戶提供自定義 getter和setter 覆蓋繼承的屬性,無論是存儲(chǔ)還是計(jì)算屬性。子類不知道繼承的屬性名稱和類型。因此,至關(guān)重要的是,用戶需要在子類中指定,名稱和在超類中指定重寫屬性的類型。
這可以通過兩種方式來完成:
當(dāng) setter 被定義為重寫屬性,用戶必須也要定義 getter。
當(dāng)我們不希望修改繼承屬性的getter,我們可以通過簡(jiǎn)單的語(yǔ)法“super.someProperty”來給超類繼承值。
classCircle{var radius =12.5var area:String{return"of rectangle for /(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as /(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius /(rect.area)")
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
Radius of rectangle for 25.0 is now overridden as 3
重寫屬性觀察者
當(dāng)一個(gè)新的屬性需要為繼承的屬性被添加,在 Swift 中推出 “屬性重寫” 的概念。通知用戶當(dāng)繼承屬性值被更改。但重寫不適用于繼承的常量存儲(chǔ)屬性和繼承只讀計(jì)算屬性。
classCircle{var radius =12.5var area:String{return"of rectangle for /(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as /(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius /(rect.area)")classSquare:Rectangle{overridevar radius:Double{
didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius /(sq.area)")
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
Radius of rectangle for 25.0 is now overridden as 3Radius of rectangle for 100.0 is now overridden as 21
最終屬性以防止重寫
當(dāng)用戶不需要讓別人訪問超類的方法,屬性或下標(biāo),Swift 引入“final”屬性,以防止覆蓋。 當(dāng) “final” 屬性被聲明后,將不允許超類的方法,屬性和下標(biāo)被覆蓋。在超類不可以有 'final' 。當(dāng) “final” 屬性被聲明后,用戶限制子類創(chuàng)建。
finalclassCircle{finalvar radius =12.5var area:String{return"of rectangle for /(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as /(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius /(rect.area)")classSquare:Rectangle{overridevar radius:Double{
didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius /(sq.area)")
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
<stdin>:14:18: error: var overrides a 'final' var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class 'Circle'
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a 'final' var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius = 12.5
當(dāng)超類聲明為 “final”和數(shù)據(jù)類型也被宣明為'final',程序?qū)⒉辉试S再創(chuàng)建子類,否則它會(huì)引發(fā)錯(cuò)誤。




















