合理的使用 Swift 中的 final 類

作者:Erica Sadun,原文鏈接,原文日期:2015-12-18
譯者:JackAlan锌唾;校對:靛青K;定稿:shanks

你上一次在 Swift 中繼承一個類是什么時候动知?而且這個類是你創(chuàng)建的但不是 Cocoa 體系中的一部分。在 protocol 擴展和一般的 extension 擴展存在的情況下员辩,你多久繼承一次非 Cocoa 類型的 class 盒粮?

如果你的答案在 0% 和 5% 之間,那你是相當具有代表性的屈暗。在 Swift 的類型體系中,引用類型不再使用繼承來緊密耦合了脂男。

進一步來說养叛,問你多久創(chuàng)建一次類和子類的目的是:他們將來會被繼承,通過一個特定模塊之外的 API 客戶端宰翅。(假設(shè)弃甥,當然,你不是 Apple汁讼,并且你沒有在寫 view 和 controller)淆攻。

當繼承成為例外而不是規(guī)則,是時候考慮默認創(chuàng)建 final 類嘿架?或者將模塊封裝為 internal-by-default 更好瓶珊?這樣公開類在原模塊外就不能被繼承。

辯論目前如火如荼的展開在 Swift 進化列表中耸彪,關(guān)于這如何進行伞芹,以及是否應(yīng)該這么做,是否類應(yīng)該被設(shè)計為強制調(diào)用父類以重寫方法(需要上層調(diào)用)蝉娜。

John McCall 寫道:


我們目前的意圖是唱较,公開的繼承和重寫將被鎖定為默認,但是內(nèi)部的繼承和重寫不會召川。我認為這達到了平衡南缓,此外,這與一般語言的代碼演進是一致的荧呐,通過以下幾種方式將促進 “無副作用” 迅速發(fā)展:

(1) 避免手工管理的障礙汉形,當你正在 hack 一個模塊最初的實現(xiàn)代碼纸镊,但是
(2) 不會讓最初的實現(xiàn)代碼在內(nèi)部隱源,并且二進制兼容允許模塊之外的代碼获雕,以及
(3) 提供良好的語言工具薄腻,來逐漸的把那些最初的原型接口構(gòu)建為更強的內(nèi)部抽象。

所有默認行為的硬限制都維系在模塊邊界上届案,因為我們假定庵楷,當你之前犯了一個錯誤的決定,這能直接的在模塊內(nèi)部修復(fù)任何問題楣颠。

所以尽纽,okay,默認一個類是可繼承的童漩,并且不是真的這樣設(shè)計的弄贿,現(xiàn)在模塊中有一些子類,這導(dǎo)致了一些問題矫膨。只要沒人改變?nèi)笔∏闆r (他們本可以無所顧忌的在任何情況下做差凹,但如果只需要一個外部的子類,那就不太可能去做)侧馅,所有這些子類仍是模塊內(nèi)的危尿,你仍然有自由的控制權(quán),以糾正最初的錯誤設(shè)計馁痴。


Joe Groff 的想法:


強大的子類化能力要求有意識的設(shè)計谊娇,就像 API 設(shè)計的其他所有方面一樣。


Jordan Rose:


關(guān)于此有趣的事情是罗晕,遺漏的錯誤:沒有考慮是否一個類應(yīng)該是 final 济欢,這比另一種選擇更糟糕。這里忽略一下優(yōu)化小渊,一個開始是 final 的類法褥,之后就無法更改;這無法改變這個類目前是如何使用的酬屉,對于許多庫發(fā)展問題挖胃,這是最好的答案: 缺省情況應(yīng)該是安全的,類的設(shè)計者可以選擇以后再改進梆惯。


本文由 SwiftGG 翻譯組翻譯酱鸭,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg垛吗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凹髓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怯屉,更是在濱河造成了極大的恐慌蔚舀,老刑警劉巖饵沧,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赌躺,居然都是意外死亡狼牺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門礼患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是钥,“玉大人,你說我怎么就攤上這事缅叠∏哪啵” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵肤粱,是天一觀的道長弹囚。 經(jīng)常有香客問我,道長领曼,這世上最難降的妖魔是什么鸥鹉? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮庶骄,結(jié)果婚禮上毁渗,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢姻,他們只是感情好祝蝠,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布音诈。 她就那樣靜靜地躺著幻碱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪细溅。 梳的紋絲不亂的頭發(fā)上褥傍,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音喇聊,去河邊找鬼恍风。 笑死,一個胖子當著我的面吹牛誓篱,可吹牛的內(nèi)容都是我干的朋贬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼窜骄,長吁一口氣:“原來是場噩夢啊……” “哼锦募!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邻遏,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤糠亩,失蹤者是張志新(化名)和其女友劉穎虐骑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎线,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡廷没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垂寥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠黎。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矫废,靈堂內(nèi)的尸體忽然破棺而出盏缤,到底是詐尸還是另有隱情,我是刑警寧澤蓖扑,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布唉铜,位于F島的核電站,受9級特大地震影響律杠,放射性物質(zhì)發(fā)生泄漏潭流。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一柜去、第九天 我趴在偏房一處隱蔽的房頂上張望灰嫉。 院中可真熱鬧,春花似錦嗓奢、人聲如沸讼撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根盒。三九已至,卻和暖如春物蝙,著一層夾襖步出監(jiān)牢的瞬間炎滞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工诬乞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留册赛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓震嫉,卻偏偏與公主長得像森瘪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子票堵,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容