取大於形態的能力被定義為繼承。一般乙個類可以從另乙個類繼承屬性和方法。類可以進一步劃分到子類和超類。
子類:當乙個類從另乙個類繼承屬性,方法和功能被稱為子類
超類:類包含屬性,方法和功能被其它類繼承稱為超類
swift 中類包含父類和呼叫訪問方法,屬性,功能和重寫方法。另外,屬性觀察者也用於新增屬性和修改所儲存的或計算的特性的方法。
基類乙個類如果不從其它類繼承方法,屬性或功能,那麼它被稱為「基類」。
複製** **如下:
classstuddetails}let stname ="swift"let mark1 =98let mark2 =89let mark3 =76
println(stname)
println(mark1)
println(mark2)
println(mark3)
當我們使用 playground 執行上面的程式,得到以下結果。
swift
9889
76這裡 studdetails 類被定義為基類,它用於包含學生名字和三個科目標記為:mark1, mark2 和 mark3. 'let'關鍵字在 playground 中初始化並使用 「println」 函式列印顯示基礎類的值。
子類在現有的基類上定義乙個新的類就叫作「子類」。子類繼承了其基類的屬性,方法和功能。要定義乙個子類使用 「 :scv**fewnf 」 在基類名稱前。
複製** **如下:
classstuddetails
func print()}class display :studdetails}let marksobtained = display()
marksobtained.print()
當我們使用 playground 執行上面的程式,得到以下結果。
mark1:93, mark2:89
「studdetails」 類定義為學生標記宣告的超類以及子類的 'display' 從它的超類繼承以打的標記。子類定義學生標記和呼叫列印方法來顯示學生的標誌。
覆蓋/重寫
訪問超類的例項,型別方法,例如,型別屬性和下標子類提供覆蓋的概念。 'override' 關鍵字用來覆蓋超類中宣告的方法。
訪問超級類的方法,屬性和下標
「super」關鍵字作為字首用來訪問超類中宣告的方法,屬性和下標。
方法和屬性覆蓋 方法覆蓋
繼承例項和型別的方法可以通過 'override' 關鍵字覆蓋在子類中定義的方法。在這裡,在子類中重寫列印來訪問超類列印type屬性。
複製** **如下:
class cricket }class tennis: cricket }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}classrectangle:circle}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}classrectangle:circle}let rect =rectangle()
rect.radius =25.0
rect.print=3
println("radius \(rect.area)")classsquare:rectangle}}let sq =square()
sq.radius =100.0
println("radius \(sq.area)")
當我們使用 playgrouwww.cppcns.comnd 執行上面的程式,得到以下結果。
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}classrectangle:circle}let rect =rectangle()
rect.radius =25.0
rect.print=3
println("radius \(rect.area)")classsquare:rectangle}}let sq =square()
sq.radius =100.0
println("radius \(sq.area)")
當我們使用 playground 執行上面的程式,得到以下結果。
複製** **如下:
:14:18: error: var overrides a 'final' var
override var area: string {程式設計客棧
^:7:9: note: overridden declaration is here
var area: string {
^:12:11: error: inheritance from a final class 'circle'
class rectangle: circle {
^:25:14: error: var overrides a 'final' var
override var radius: double {
^:6:14: nscv**fewnfote: overridden declaration is here
final var radius = 12.5
當超類宣告為 「final」和資料型別也被宣明為'final',程式將不允許再建立子類,否則它會引發錯誤。
本文標題: 解析swift語言面相物件程式設計中的繼承特性
本文位址:
面相物件 面相過程
oc是物件導向 c面向過程 區別 面向過程 關注解決問題需要的步驟 物件導向 關注解決問題需要的物體 術語 面向過程 procedure oriented 物件導向 object oriented 物件導向程式設計 object oriented programming 類 物件 成員變數 區別 類...
面相物件基礎
1.方法的重寫 1 發生在父子類中,方法名相同引數列表相同,為方法的重寫。2 重寫的方法被呼叫的時候看物件的型別。注意事項 重寫需要遵循 兩同,兩小,一大的原則 1 兩同 方法名稱相同,引數列表相同 2 兩小 基本資料型別的方法的返回值必須相同。引用資料型別可以小於或者等於父類的資料型別。子類方法中...
面相物件,關於物件
1 萬物皆物件。將物件看做是乙個特別的變數,它是乙個可以儲存資料的東西,除此之外,你還可以要求它在自身上進行操作。理論上而言,萬物皆物件,可以抽取待求解的任何概念化構件,例如貓 狗 建築物 衣服等等。我們可以將他們表示成為程式中的物件。2 程式是物件的集合,他們通過傳送訊息來告知彼此所需要做的。要想...