2013-10-01 17 views
1

比方說,假設我繼承NSString。我的子類名爲MyString,我想覆蓋[NSString stringWithFormat:],但也添加了另一個參數,所以我的方法是[MyString stringWithParameter:format:]。這種方法將取代[NSString stringWithFormat:]Objective-C和繼承:禁止使用超類方法的Foundation子類

如果這是我的設置,用戶仍然可以撥打[MyString stringWithFormat:],這又將撥打[NSString stringWithFormat:]。有沒有辦法阻止用戶撥打[MyString stringWithFormat:]?換句話說,是否有辦法阻止對象的子類調用其父類的特定方法?

+0

如果你繼承'NSString',你可能做一些艱辛的道路。 –

+1

這可能是。這更像是一種假設而非其他任何事情。 – Mason

回答

1

使用編譯器屬性標記方法不可用。在您的頭文件中:

+ (id)stringWithFormat:(NSString *)format, ... __attribute__((unavailable("Do not call +stringWithFormat"))); 

這將導致編譯器錯誤並阻止使用該方法。

http://i.imgur.com/31h1AF4.png

enter image description here

+0

很好的答案。謝謝! – Mason

1

正如其他人所暗示的,NSString是一個類集羣,因此可以很正確地進行子類化。但顯然你的問題是關於子類的更廣泛的概念,而不是處理類集羣增加的複雜性,所以讓我們把它放在一邊。

,而不是防止主叫方發送stringWithFormat:MyString實例的角度思考,考慮讓你的MyString類重寫stringWithFormat:調用您的自定義stringWithParameter:format:方法,並提供了parameter參數的默認值。

正如@Stephen Melvin指出的那樣,通常您的自定義方法會調用[super stringWithFormat:]來保留現有功能。

編輯

這裏是繼承一個類簇時要考慮幾點:

你一個類簇中創建一個新類必須:

  • 做個集羣抽象超類的子類
  • 聲明自己的存儲
  • 覆蓋超
  • 覆蓋的所有初始化方法超類的原始方法(見下文)

來源:https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html

如果你覺得它會是值得的努力,邁克·阿什有一個偉大的博客文章如何去了解它:http://www.mikeash.com/pyblog/friday-qa-2010-03-12-subclassing-class-clusters.html

但問問自己的第一個問題是:「我試圖通過子類NSString解決什麼問題(或者無論情況如何),是否有解決問題的更簡單的方法?「

+0

您可否詳細說明子類化類的複雜性? – Mason