2014-09-10 27 views
0

可以說我有一個基於NSObject的Deck類。 我們也有基於Deck類的PlayingCardDeck。除了指定的方法之外,方法是否可以返回不同的返回類型?

下面的方法合法嗎?

-(Deck *) createDeck 
{ 

    return [[PlayingCardDeck alloc]init]; 
} 
+0

是的,如果PlayingCardDeck派生自Deck。當你有多個子類時,這通常很有用。 – puru020 2014-09-10 17:27:18

+0

當然,返回聲明的返回類型的子類是合法的 - 子類可以始終替代其超類。在Objective-C中,沒有任何東西(除了可能是警告消息)真正阻止方法從聲明爲返回NSNumber的方法返回NSString。 – 2014-09-10 17:28:17

+0

考慮將它作爲類方法,並將其重命名爲與Cocoa編碼準則一致。由此產生的簽名是'+(甲板*)甲板',你可以這樣調用它:'甲板* myDeck = [甲板甲板];' – jlehr 2014-09-10 19:09:46

回答

1

假設你正確編碼了對象繼承:是的,這是合法的,因爲你的PlayingCardDeck確實是一個Deck。

1

是的,一個方法可以返回一個不同的類型,只要它與指定的類型兼容即可。

我們有PlayingCardDeck這是基於Deck類。

然後返回PlayingCardDeck的實例是完全可以的,因爲它是Deck

這種技術在OOP中非常重要和流行。它可以讓你隱藏實現,並公開接口。例如,您可以創建多個Deck實現,但讓用戶只知道頂級Deck類。這使您可以靈活選擇實現而不會破壞用戶的代碼。

可可框架也使用這個概念很多。例如,使用返回類型NSString聲明NSString10的某些方法實際上會返回NSString的子類。由於用戶代碼不需要知道子類,所以他們可以方便地編寫NSString,並編程到它的接口。