Swift 繼承
取大於形態的能力被定義爲繼承。一般一個類可以從另一個類繼承屬性和方法。類可以進一步劃分到子類和超類。
子類:當一個類從另一個類繼承屬性,方法和功能被稱爲子類
超類:類包含屬性,方法和功能被其它類繼承稱爲超類
Swift 中類包含父類和調用訪問方法,屬性,功能和重寫方法。另外,屬性觀察者也用於添加屬性和修改所存儲的或計算的特性的方法。
基類
一個類如果不從其它類繼承方法,屬性或功能,那麼它被稱爲「基類」。
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)
當我們使用 playground 運行上面的程序,得到以下結果。
swift
98
89
76
這裏 StudDetails 類被定義爲基類,它用於包含學生名字和三個科目標記爲:mark1, mark2 和 mark3. 'let'關鍵字在 playground 中初始化並使用 「println」 函數打印顯示基礎類的值。
子類
在現有的基類上定義一個新的類就叫作「子類」。子類繼承了其基類的屬性,方法和功能。要定義一個子類使用 「 : 」 在基類名稱前。
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()
當我們使用 playground 運行上面的程序,得到以下結果。
Mark1:93, Mark2:89
「StudDetails」 類定義爲學生標記聲明的超類以及子類的 'display' 從它的超類繼承以打的標記。子類定義學生標記和調用打印方法來顯示學生的標誌。
覆蓋/重寫
訪問超類的實例,類型方法,例如,類型屬性和下標子類提供覆蓋的概念。 'override' 關鍵字用來覆蓋超類中聲明的方法。
訪問超級類的方法,屬性和下標
「super」關鍵字作爲前綴用來訪問超類中聲明的方法,屬性和下標。
重寫
訪問方法,屬性和標
方法
super.somemethod
屬性
super.someProperty
下標
super[someIndex]
方法和屬性覆蓋
方法覆蓋
繼承實例和類型的方法可以通過 'override' 關鍵字覆蓋在子類中定義的方法。在這裏,在子類中重寫打印來訪問超類打印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()
當我們使用 playground 運行上面的程序,得到以下結果。
Welcome to Swift Super Class
Welcome to Swift Sub Class
屬性重寫
可以覆蓋繼承的實例或類屬性來提供自定義的getter和setter 屬性,或添加屬性觀察者,當下層屬性值更改時以使重寫屬性到觀察者。
重寫屬性getter和setter
Swift 允許用戶提供自定義 getter和setter 覆蓋繼承的屬性,無論是存儲還是計算屬性。子類不知道繼承的屬性名稱和類型。因此,至關重要的是,用戶需要在子類中指定,名稱和在超類中指定重寫屬性的類型。
這可以通過兩種方式來完成:
當 setter 被定義爲重寫屬性,用戶必須也要定義 getter。
當我們不希望修改繼承屬性的getter,我們可以通過簡單的語法「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)")
當我們使用 playground 運行上面的程序,得到以下結果。
Radius of rectangle for 25.0 is now overridden as 3
重寫屬性觀察者
當一個新的屬性需要爲繼承的屬性被添加,在 Swift 中推出 「屬性重寫」 的概念。通知用戶當繼承屬性值被更改。但重寫不適用於繼承的常量存儲屬性和繼承只讀計算屬性。
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)")
當我們使用 playground 運行上面的程序,得到以下結果。
Radius of rectangle for 25.0 is now overridden as 3
Radius of rectangle for 100.0 is now overridden as 21
最終屬性以防止重寫
當用戶不需要讓別人訪問超類的方法,屬性或下標,Swift 引入「final」屬性,以防止覆蓋。 當 「final」 屬性被聲明後,將不允許超類的方法,屬性和下標被覆蓋。在超類不可以有 'final' 。當 「final」 屬性被聲明後,用戶限制子類創建。
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)")
當我們使用 playground 運行上面的程序,得到以下結果。
override var area: String {
^
var area: String {
^
class Rectangle: Circle {
^
override var radius: Double {
^
final var radius = 12.5
當超類聲明爲 「final」和數據類型也被宣明爲'final',程序將不允許再創建子類,否則它會引發錯誤。