說了那麼多次的重寫,這次我們就來認真的對待一下方法的重寫。
合約
我們說了,繼承就相當於是簽訂合約,我們繼承出來的子類一定要遵守這個合約,那麼就算你想要做一些合約裡沒有的事情,也要遵守合約的規範,所以,你重寫方法,也一定要符合方法的類型。
我們講過方法的類型,它以 ()->() 這樣來表示。所以,重寫的方法也一定要遵守這個類型即接收參數返回參數類型要相同……名字要相同還需要我說嗎?
重寫
覆蓋 ,這個關鍵詞我搞不懂為什麼會被翻譯為超馳,另外還好大家都沒有在 Swift 裡翻譯成超馳而是翻譯成了重寫:
所謂超馳控制就是當自動控制系統接到事故報警、偏差越限、故障等異常信號時,超馳邏輯將根據事故發生的原因立即執行自動切手動、優先增、優先減、禁止增、禁止減等邏輯功能,將系統轉換到預設定好的安全狀態,並發出報警信號。
這裡我把它翻譯為重寫,雖然說覆蓋更恰當——但重寫更直觀吧。我們已經重寫過很多方法了:
1 2 3 4 5 6 |
class MachineGun:Weapon { override func fire() { print("dadadada!") } } |
使用 override 來重寫,除了要保證“履約”:名字相同類型相同外,訪問權限也的修改只能提高不能降低,也就是說,如果你給父類重寫順帶加一個 private 前綴是不可接受的:
但是,如果你要嘗試提高權限:
這裡說沒有意義,是因為方法的權限比所在類高了——這樣方法一樣不會被訪問到。
權限問題
很遺憾我們的大綱裡沒有包括權限這部分的課程,那我這裡就簡單來提一下:
在 Swift 中我們有三種權限:
- 上市
- 內部
- 私人的
前一個和後一個我們都懂,中間那個是什麼呢? ——其實它就是默認的,如果你不聲明權限前綴,那麼默認就是 internal。
public 就不說了,private 也好理解,是私人日記。internal 的範圍則是你開發的一個項目的範圍,別的項目不能訪問。
與之無關的東西
如果你在重寫一個方法的時候忘記寫 override 關鍵字,那 Xcode 會提示你,但如果你沒有理會同時又寫錯了方法的類型——那麼恭喜你,編譯器不會報錯,而是認為你重載了這個方法。
它與繼承沒有任何關係,只是另外一個方法恰好有了與父類方法相同的名字罷了……對於多態來說,編譯器依舊可以用函數類型來區分這兩個具有相同名稱的方法——就好像總有重名的人一樣。
對於重載的方法,你可以理解為兩個方法只是碰巧重名罷了,在多態裡依舊會調用父類的那個方法,如果你單獨調用,就會看到這樣的提示了:
所以對於它的存取權限你就隨意了。
課後題
考慮到根本沒人做,不留了。
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1123.html
註釋