2014-01-08 51 views
4

我讀了一些書約objective C,他們說那裏NSNumberabstractsuperclass的許多subclasses,我們可以使用。理解抽象的超NSNumber的

因此,「當我們調用NSNumber中的方法時,就會使用適當的子類」。

這不是與其他一些規則,我知道要:

如果superclass A,有subclass B,而你打電話的超A級的方法,那就是在子乙,你可以這樣做 - 因爲繼承工作一直在進行,而不是停滯。

那麼,superclass (abstract) class- NSNumber怎麼樣,正在使用它的subclass方法?

這裏的層次結構是什麼?

謝謝。

+0

我猜你正在閱讀S.Kochan的 「編程在Objective-C」=)。酷的初學者教程,但與Objective-C相關的一些技術概念缺失,並且一些技術概念被描述得過於寬泛。 –

+0

是的,這就是我正在閱讀:)我知道,我正在開發幾年,而我只是想重新做一遍。 – Curnelious

+0

這是錯誤的:「如果超類A具有B的子類,並且您在超類A中調用了一個方法,而這個方法在子類B中,那麼您不能這樣做」,或者至少是一種誤解。您可以在超類中調用NAMED方法,但是如果子類中存在這樣的方法,您總是會得到表示實際對象的子類中存在的方法。 –

回答

4

它通過class cluster模式完成。
從技術文檔:

在類簇中的抽象超類必須申報其私人子類 創建實例的方法。這是超類的 責任,根據您調用的創建方法分配適當子類的對象 - 您不需要,也不能選擇 類的實例。

每當用某種工廠方法創建編號時,如+numberWithInt:,工廠就會返回具體子類的實例。之後,當你打電話給-stringValue:這個選擇器時,這個選擇器被髮送到具體的實例NSNumber子類 - int在這種情況下。
因此,NSNumber工廠方法實際上不返回NSNumber對象 - 它們返回具體的子類。其他Cocoa類集羣也是如此 - NSArray,NSDictionary,NSSet

+0

爲了澄清Petro的(正確的)答案,斷言「當我們在NSNumber中調用一個方法時,使用適當的子類」是真的,只有創建NSNumbers的方法纔會發生,其他方法只發送給最終的私有子類。 –

+0

好的,我們可以通過添加簡單的單詞'factory'來糾正這個斷言。 「當我們在NSNumber中調用'工廠'方法時,使用appropritate子類」=) –

+0

謝謝,所以當你說返回一個對象時,這意味着NSNmuber類正在分配它的一個子類的對象?我無法想象那裏會發生什麼。 – Curnelious

2

實際上有類NSDoubleNumber,NSLongLongNumber,NSIntegerNumber等,(製造名稱),你會得到適當的。但是和所有的子類一樣,如果你通過它的超類類型調用對象的方法,它將響應,調用適合於該實例的類特定方法。因爲如果你問什麼是類,它不會返回「NSDoubleNumber」或其他東西,而是返回一個本質上毫無意義的名字,用於整個集羣或者它的一個特定的細分。

問題是,您可以將實例視爲單個虛構類「NSNumber」的對象,並且永遠不用擔心實際擁有哪個子類。

(順便說一句,類似的事情的NSArray,NSDictionary中,和許多其他類也是如此。)

+0

是否有你剛剛使用過的名字的證明('NSDoubleNumber','NSLongLongNumber'等)?我的意思是,[@(1.25f)class]和[@(1)class]的'NSLog''會給出相同的結果'__NSCFNumber'。而且,它們具有相同的'isa'指針,所以它看起來像一些複合對象一樣實現......只需要獲取名稱的源代碼就很有趣。 –

+0

@PetroKorienev - 不,我做了這些,作博覽會。真名是隱藏的。 –

+0

感謝,但我沒有得到你所說的..我無法想象實際的層次結構,你能給我一個簡單的例子,當我從nsnumber調用某種方法時會發生什麼? – Curnelious