Swift中的存取控制和protected

來源:互聯網
上載者:User

   這篇文章主要介紹了Swift中的存取控制和protected,本文主要講解為什麼Swift沒有類似protected的選項,需要的朋友可以參考下

  原文再續,書折第一回。

  很多其他程式設計語言都有一種”protected“設定,可以限制某些類方法只能被它的子類所使用。

  Swift支援了存取控制後,大家給我們的反饋都很不錯。而有的開發人員問我們:“為什麼Swift沒有類似protected的選項?”

  當我們在設計Swift存取控制的不同等級時,我們認為有兩種主要情境:

  ●在一個APP裡:隱藏某個類的私密細節。

  ●在一個開源架構裡:不讓匯入這個架構的APP,隨便接觸架構的內部實現細節。

  上面的兩種常見情況,對應著private和internal這兩個等級。

  而protected相當於把存取控制和繼承特性混在一起,把存取控制的等級設定增加了一個維度,使之複雜化。即使設定了protected,子類還是可以通過新的公開方法、新的屬性來接觸到所謂“protected”了的API。另一方面,我們可以在各種地方重寫一個方法,所謂的保護卻沒有提供最佳化機制。這種設定往往在做不必要的限制 一 protected允許了子類,但又禁止所有其他別的類(包括那些協助子類實現某些功能的類)接觸父類的成員。

  有的開發人員指出,apple的架構有時候也會把給子類用的API分隔出來。這時候protected不就有用了嗎?我們研究後發現,這些方法一般屬於下面兩種情況:一是這些方法對子類以外的類沒啥用,所以不需要嚴格保護(例如上面說的協助實現某些功能的類)。二是這些方法就是設計出來被重寫,而不是直接用的。舉個例子,drawRect(_:)就是在UIKit基礎上使用的方法,但它不能在UIKit以外應用。

  除此之外,如果有了protected,它要怎麼樣和extension相互作用呢?一個類的extension能接觸它的protected成員嗎?一個子類的extension可以接觸父類的protected成員嗎?extension聲明的位置對存取控制等級有沒有影響呢?(複雜到要哭了是不是?)

  對存取控制的設計,也依循了Objective-C開發人員(包括apple內外的)的常規做法。Objective-C方法和屬性一般在.h標頭檔裡聲明,但也可以寫在.m實現檔案裡。假如有一個公開的類,想把裡面某些部分設為只有架構內可以擷取時,開發人員一般會建立另一個標頭檔給內部使用。以上三種存取層級,就對應了Swift裡面的public,private和internal。

  Swift的存取控制等級和繼承無關,是單維度、非常清楚明了的。我們認為這樣的模式更簡潔,同時滿足了最主要的需求:將一個類、或一個架構的實現細節隔離保護起來。這可能和你以前用過的不同,但我們鼓勵你試試看。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.