Swift難點 繼承中的構造規則例項詳解

2021-07-12 01:04:33 字數 3039 閱讀 7772

**:

如有侵犯,請來信[email protected]

關於繼承中的構造規則是乙個難點。

我的swift入門教程專欄

為什麼要有構造器:為類中自身和繼承來的儲存屬性賦初值。

一、兩種構造器-指定構造器和便利構造器

指定構造器:類中必備的構造器,為所有的屬性賦初值。(有些子類可能不需要顯示宣告,因為預設從基類繼承了)

便利構造器:類中的輔助構造器,通過呼叫指定構造器為屬性賦初值。(僅在必要的時候宣告)

舉例[plain]view plain

copy

class food   

convenience init()   

}  

便利構造器通過convenience關鍵字宣告,可以看到,便利構造器是通過呼叫指定構造器來進行構造的。這也就是乙個關鍵的概念:橫向**。

何為**:就是讓別人幫你幹活

二、構造過程中的規則

(一)構造器鏈就是呼叫構造器的順序

規則如下:

1.1、指定構造器必須呼叫其父類的指定構造器

1.2、便利構造器必須呼叫同一類中的指定構造器

1.3、便利構造器必須最後以呼叫乙個指定構造器而結束

總得來說一句話:便利構造器橫向**,指定構造器向上**。

舉個例子:

[plain]view plain

copy

class base  

convenience init()  

}  class sub:base  

convenience init(consubinput:string)  

convenience init()  

}  

(二)關於構造器的繼承與過載

swift中,子類不會預設繼承父類的構造器。

構造器的過載遵循構造器鏈的規則(1.1-1.3)

構造器的繼承規則如下:

2.1、如果子類中沒有定義任何指定構造器,將會自動繼承所有父類的指定構造器

2.2、如果子類中提供了所有父類指定構造器,不管是通過規則2.1繼承來的,還是自定義實現的,它將繼承所有父類的便利構造器。

注意:子類可以通過部分滿足規則2.2的方式,使用子類便利構造器來實現父類的指定構造器

。例子一:

[plain]view plain

copy

class base  

convenience init()  

}  class sub:base  

這裡子類沒有定義任何構造器,所以滿足規則2.1,2.1,將繼承所有父類的指定構造器和便利構造器

所以可以這麼呼叫

[plain]view plain

copy

var instance1 = sub()  

var instance2 = sub(baseinput:"newbasevar")  

例子二[plain]view plain

copy

class base  

init(firstpart:string,secondpart:string)  

convenience init()  

}  class sub:base  

}  

這裡,子類只是實現了父類的乙個構造器,所以並未繼承便利構造器,也沒有繼承另外乙個指定構造器

只可以這麼創造例項

[plain]view plain

copy

var instance = sub(subinput:"subvar",baseinput:"basevar")  

(三)基於上述兩個規則,構造過程分為兩個部分

階段一

階段二

可能這個規則有點抽象,舉個例子就明白了

[plain]view plain

copy

class base  

}  class sub:base  

init(subinput:string,baseinput:string)  

}  

總得來說:當類的例項的記憶體被初始化完成,也就是呼叫super.init()之後,就完成了階段一了。

三、編譯器的安全檢查

檢查一指定構造器必須在它所在類的屬性先初始化完成後才能把構造任務向上**給父類中的構造器。簡單來說,就是先初始化自己的儲存屬性,在呼叫父類的super.init向上初始化

檢查二指定構造器必須先向上呼叫父類構造器,在為繼承來的屬性賦初值。這個很簡答,假設繼承來個x,你先為x賦值為1了,而在呼叫父類構造器,父類構造器會為x賦另外乙個初值來保證初始化過程完成,那麼你賦值的1就被覆蓋了

檢查三便利構造器先呼叫同類中其他構造器,再為任意屬性賦初值。和檢查二類似,也是防止被覆蓋

檢查四構造器在第一階段完成之前,不能飲用self,不能呼叫任何例項屬性,不能呼叫例項方法

四、總結一下

指定構造器的過程是這樣的

1、為自己的屬性賦初值

2、呼叫基類構造器(super.init)

3、然後就可以呼叫self,和例項方法,儲存屬性。定製新的值了。

然後,我們看下官方文件裡給出的乙個比較好的例子

[plain]view plain

copy

class food   

convenience init()   

}  class recipeingredient: food    

override convenience init(name: string)   

}  class shoppinglistitem: recipeingredient   

}  

這個構造器鏈的關係如圖

Swift難點 繼承中的構造規則例項具體解釋

關於繼承中的構造規則是乙個難點。我的swift新手教程專欄 為什麼要有構造器 為類中自身和繼承來的儲存屬性賦初值。一 兩種構造器 指定構造器和便利構造器 指定構造器 類中必備的構造器。為全部的屬性賦初值。有些子類可能不須要顯示宣告,由於預設從基類繼承了 便利構造器 類中的輔助構造器,通過呼叫指定構造...

java基礎 繼承中的構造方法規則

一 相關規則 1 子類的構造過程中必須呼叫父類的構造方法 2 子類可以在自己的構造方法中使用super argumentlist 來呼叫父類的構造方法 使用this argumentlist 呼叫本類的其他構造方法 如果使用super argumentlist 來呼叫父類的構造方法,必須寫在子類構造...

Swift中的構造方法

注意 swift對類的構造方法有乙個基本的要求,那就是當構造完乙個物件之後,物件中所有的儲存屬性都要被初始化。對構造方法的理解 構造方法的作用是對物件進行初始化,也就是給物件所占用的記憶體進行初始化。但是只有儲存屬性才會真正地佔據記憶體。所以,構造方法的最主要目的是將所有的儲存屬性設定初始值。即乙個...