2016-12-24 94 views
3

Swift's documentation爲什麼我們在Swift中重寫初始值設定項?

不像在Objective-C的子類,斯威夫特子類不繼承默認 其超初始化。

但隨後說:

當你寫一個匹配超 指定初始化一個子類的初始化,您可以高效地提供的 是指定初始化覆蓋。因此,您必須在子類的初始化程序定義之前寫入覆蓋 修飾符。

從構造函數沒有繼承的Java背景來看,我不明白它是如何工作的。爲什麼我們要重寫一個默認不被繼承的初始化器?在我看來,像構造函數一樣,初始化函數會隱式地按類自身命名,並且可以在子類中重載(例如,Java中的Dog類只有名稱爲Dog的構造函數)。但我不明白這個覆蓋父類初始化器的想法。

回答

0

子類可能不會繼承它們的超類初始化「默認」,但它們可以被繼承(例如,如果你沒有提供任何指定的初始化符,你將自動繼承超類的所有指定初始化符......見Automatic Initializer Inheritance )。

考慮一個Dog子類,稱爲Chihuahua:如果你不Chihuahua實現任何指定的初始化程序,你與你的部分沒有多餘的代碼自動繼承Dog初始化。但是,如果您確實需要覆蓋它,出於某種原因,那麼只需從Chihuahua指定的初始值設定項中調用Dog指定的初始值設定項即可。如果您的Chihuahua初始值設定項與Dog指定的初始值設定項具有相同的特徵碼,那麼您必須明確提供override關鍵字。

+0

啊,這樣做很有道理,謝謝!所以這個覆蓋只適用於初始化器是從超類繼承的嗎? – rb612

+0

是的,或者更確切地說,[如文檔所述](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/) uid/TP40014097-CH18-NoLink_137)「與重寫的屬性,方法或下標一樣,」override「修飾符的存在提示Swift檢查超類是否有一個匹配的指定初始化程序被覆蓋,並驗證您的覆蓋初始化器已按預期指定。「 – Rob

相關問題