2010-07-20 84 views
3

多重繼承我想實現一個可移動的UIView類(動作來看,當你觸摸它,移動你的手指),例如:需要在目標C

@interface MovableView : UIView { 
    some members; 
} 
-touchesBegan; 
-touchesMoved; 
@end 

如何申請該代碼的UILabel,UIButton的等沒有多重繼承?在C++中,我會做這樣的(用的UIView作爲一個虛擬基地MovableView):

struct MovableLabel : UILabel, MovableView {}; 

類別可供作爲替代多重繼承,但我絕對UIView的使用類別,因爲不想程度這將適用於我的應用程序中的所有視圖。我只想讓我的一些觀點可以移動。

我目前的避免代碼重複的策略是將MovableView代碼放入一個頭文件中,並在每次需要某個類使用時都包含它。除此之外,我還必須將MovableView的成員添加到我正在編寫的任何課程中。這是純粹的代碼醜陋,但比我的項目中複製/粘貼代碼更好。

有沒有人有任何其他的想法來解決這個Objective C限制[沒有多重繼承]?

感謝,

俺答

+0

[Objective C中的多重繼承]的可能的重複(http://stackoverflow.com/questions/5951388/multiple-inheritance-in-objective-c) – Mark 2012-01-09 11:28:56

回答

7

的Objective-C不會讓你這樣做混入繼承的東西,除了通過將同一類別給每個你關心,以增加類。然後,你將不會獲得額外的實例變量。

對於你的具體問題,我可能會通過設計MovableView作爲一個容器類,它只是一個有子視圖(UILabel,UIButton等)的對象,你想移動它的子視圖。

+0

而且有一個很好的理由來禁止多重繼承:在舊的C++時代這樣的技術會導致依賴地獄,而在現代的鬆散耦合中,你想要避免像依賴地獄之類的東西 – 2010-07-20 21:23:05

+0

好主意,quixoto。在Interface Builder中做更多的工作,但更少的類和編碼。 – Altan 2010-07-21 00:26:47

2

分類無論如何不會有幫助,因爲替換UIButton上真實的touchesBegan方法會非常糟糕......您無法從類別中調用[super]。

另一個解決方案是注入的方法到這些類定義的東西,如:

Method origMethod = class_getClassMethod([UIButton class], @selector(touchesBegan)); 
Method newMethod = class_getClassMethod([TemplateClass class], @selector(replacementTouchesBegan)); 
method_exchangeImplementations(origMethod, newMethod); 

但是,這是相當繁瑣的。雖然如果它真的是你想要去的地方,這是值得研究...

我會做的是做一個MovableView類繼承UIView,並簡單地添加任何你想移動作爲該視圖的子視圖(這我認爲可能與quixoto說的略有不同,如果不是,我很抱歉)。它首先響應觸摸,並將它不需要的任何東西傳遞給下一個響應者......無需使用單個子視圖創建特殊的類。然後在IB中,您可以將這些可移動的視圖放置在任何位置並將其放入其中。

一般來說,這樣的組合技巧在UIKit中非常方便,而不是修改核心類。