自定義:覆蓋!

說了那麼多次的重寫,這次我們就來認真的對待一下方法的重寫。

合約

我們說了,繼承就相當於是簽訂合約,我們繼承出來的子類一定要遵守這個合約,那麼就算你想要做一些合約裡沒有的事情,也要遵守合約的規範,所以,你重寫方法,也一定要符合方法的類型。

我們講過方法的類型,它以 ()->() 這樣來表示。所以,重寫的方法也一定要遵守這個類型即接收參數返回參數類型要相同……名字要相同還需要我說嗎?

 

重寫

覆蓋 ,這個關鍵詞我搞不懂為什麼會被翻譯為超馳,另外還好大家都沒有在 Swift 裡翻譯成超馳而是翻譯成了重寫:

所謂超馳控制就是當自動控制系統接到事故報警、偏差越限、故障等異常信號時,超馳邏輯將根據事故發生的原因立即執行自動切手動、優先增、優先減、禁止增、禁止減等邏輯功能,將系統轉換到預設定好的安全狀態,並發出報警信號。

這裡我把它翻譯為重寫,雖然說覆蓋更恰當——但重寫更直觀吧。我們已經重寫過很多方法了:

使用 override 來重寫,除了要保證“履約”:名字相同類型相同外,訪問權限也的修改只能提高不能降低,也就是說,如果你給父類重寫順帶加一個 private 前綴是不可接受的:

重寫的方法不能降低權限
重寫的方法不能降低權限

但是,如果你要嘗試提高權限:

雖然沒有意義,但可以接受
雖然沒有意義,但可以接受

這裡說沒有意義,是因為方法的權限比所在類高了——這樣方法一樣不會被訪問到。

權限問題

很遺憾我們的大綱裡沒有包括權限這部分的課程,那我這裡就簡單來提一下:

在 Swift 中我們有三種權限:

  • 上市
  • 內部
  • 私人的

前一個和後一個我們都懂,中间那个是什么呢?——其实它就是默认的如果你不声明权限前缀那么默认就是 internal

public 就不说了private 也好理解是私人日记internal 的范围则是你开发的一个项目的范围别的项目不能访问

与之无关的东西

如果你在重写一个方法的时候忘记写 override 关键字那 Xcode 会提示你,但如果你沒有理會同時又寫錯了方法的類型——那麼恭喜你,編譯器不會報錯,而是認為你重載了這個方法。

它與繼承沒有任何關係,只是另外一個方法恰好有了與父類方法相同的名字罷了……對於多態來說,編譯器依舊可以用函數類型來區分這兩個具有相同名稱的方法——就好像總有重名的人一樣。

對於重載的方法,你可以理解為兩個方法只是碰巧重名罷了,在多態裡依舊會調用父類的那個方法,如果你單獨調用,就會看到這樣的提示了:

屏幕快照 2015-08-06 下午5.19.21
碰巧同名的方法

所以對於它的存取權限你就隨意了。

課後題

考慮到根本沒人做,不留了。

由...出版 R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

加入對話

1 評論

您的電子郵件地址不會被公開. 必填字段標 *