2013-03-15 139 views
9

我有一個iPhone應用程序中的哪一類一個一個子類的UIViewController我該如何從多個超類繼承自定義類?

enter image description here

現在我正在製作新的應用程序,其中我想重新使用,但它從,這是很好的繼承,因爲子從的UIViewController

enter image description here

但現在我有另一個類,Ç,這是一個子類GLKViewController

enter image description here

問題是當我試圖讓第三應用程序,它重新使用B沒有任何更改。由於B,從的UIViewController繼承,我需要以某種方式告訴Ç,它應該繼承GLKViewController,我相信這是多重繼承的情況:

enter image description here

從我正在閱讀中,處理此問題的最佳方法是與組合,但我不明白如何最好地將其應用於我的情況ñ。

作爲一個獨立的解決方案,我意識到我可以只創建一個包裝d,我可以再修改上的應用程序逐個應用程序的基礎,從手頭的任務適當的超類的子類:

enter image description here

enter image description here

但是,這似乎有點哈克。有一個更好的方法嗎?

+0

什麼是UIScrollViewController? – jrturton 2013-03-15 19:17:48

+1

如何在UIViewController上使用類別而不是子類化?由於UIScrollViewController繼承自UIViewController,因此您的類別也可用於UIScrollViewController的實例。噢,真的很好的問題+1! – Till 2013-03-15 19:22:10

+3

你不能這樣做,在Objective-C是單繼承 - 像Java 使用的成分或代表團 – 2013-03-15 19:34:19

回答

7

Objective C只支持單繼承。在這種情況下,你可能想使用協議來實現通用功能。您可以使用助手對象來實現協議方法。在這種情況下,您對對象是否是特定類的成員不感興趣,但是它是否實現了一組特定的方法。

+1

當你說「你對你的對象是否是特定類的成員不感興趣」時,我很好奇你指的是哪一類 - UIViewController或B?因爲我很確定我真的有興趣將它作爲這兩個類的一部分,無論是在訪問實例變量和方法方面。 – todd412 2013-03-16 16:29:45

+0

正確,協議允許類似的功能多重繼承。不幸的是,他們不允許默認的實現,這往往會導致代碼重複,而不是那些依賴類集羣(輔助對象,就像你稱之爲的)那樣不那麼優雅的解決方案。無論如何,從外部來看,這可能是一個很好的替代品。 – Till 2013-03-17 02:52:34

3

你不能在Objective-C中做到這一點 - 單一繼承 - 就像java或大多數其他現代語言。

使用的成分或代表團的範例

+0

固定 - 從評論 – 2013-03-15 22:08:11

+1

刪除ios ...我刪除了可能苛刻的聽起來的評論...:D – Till 2013-03-16 03:41:50

1

你可能得到的是覆蓋使用類別。它當然不是多重繼承,但有時做這項工作。

讓我爲一個類別起草一個例子,看看它是否符合你的目標。

頁眉:UIViewController+MyAwesomeExtension.h

@interface UIViewController (MyAwesomeExtension) 
- (void)doSomething; 
@end 

實現:UIViewController+MyAwesomeExtension.m

@implementation UIViewController (MyAwesomeExtension) 
- (void)doSomething 
{ 
    NSLog(@"doing something totally awesome"); 
} 
@end 

現在你正在使用它從你UIViewController的一個子類其中還包括像例如內GLKViewController ...

實現:

#import "UIViewController+MyAwesomeExtension.h" 
... 
[self.viewControllerDerivedClass doSomething]; 
... 

注意,這樣的分類也有其侷限性。要了解更多信息,如何進一步研究該主題。


總的來說,我認爲「最」正確的答案將使用協議來獲得儘可能接近多重繼承,儘可能麥克C.在他的回答起草。我的答案主要是針對簡單案例的解決方法。

+0

謝謝,我不確定一個類別會在這裏做詭計 - 我的課A依靠繼承B和UIViewController(或GLKViewController)的實例變量和實例方法,A也成爲.xib文件的文件所有者。所以目前還不清楚一個類別是否可以完成所有這些事情。 – todd412 2013-03-16 16:32:48