2017-03-04 65 views
2

規則1斯威夫特初始化規則混亂

如果你的子類沒有定義任何指定的初始化程序,它會自動繼承其所有的超指定初始化的。

混亂:我在子類中提供了一個指定的初始化器。它的意思是沒有超類指定的初始化器會歸結爲子類。但我仍然需要編寫覆蓋關鍵字來提供在子類(這意味着超類指定的init歸結爲子類)中的任何超類指定的初始化器的實現。規則1說如果我提供了子類指定的初始化程序,那麼指定的超類將不會下降。 (如果我們沒有提供任何指定的子類的初始化,覆蓋僅有意義。)

class Food{ 
    var name : String 
    init(foodName :String) { 
     self.name = foodName 
    } 
} 

class RecipieIngredient : Food{ 
    var quantity : Int 
    init(fName :String, quantity :Int) { 
     self.quantity = quantity 
     super.init(foodName: fName) 
    } 

    override convenience init (foodName :String){ 
     self.init(fName: foodName, quantity: 1) 
    } 
} 
+0

你能提供一個你所指的超類和子類的例子嗎?具體而言,你不清楚你在問什麼。 –

+0

我添加了代碼問題。 @SørenMortensen –

回答

-2

這是因爲init()不是受保護的方法。所以,如果你在子類中定義了一個init()方法,那麼編譯器不知道你是指超類的init()方法還是子類。 '覆蓋'清除了這一點。

+0

「受保護的方法」是什麼意思? Swift沒有受保護的訪問級別。 'override'關鍵字不是爲了消除方法的歧義 - 只是簡單地明確指出你正在提供覆蓋,並允許編譯器檢查超類是否有匹配的聲明。 – Hamish

+0

你是對的。我使用了「受保護」一詞,因爲Swift沒有類似的關鍵字。至於消除歧義,是的。嘗試創建任何超類,並使用聲明具有相同簽名的方法的子類。 – dylanthelion

+0

沒有歧義,因爲沒有歧義。在動態分派調用的情況下,類'vtable在運行時使用以查找正確的實現。在調用靜態調度的情況下,編譯器只需查找該類型的聲明以查找要派發到的實現。 – Hamish