2010-07-20 106 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中非常方便,而不是修改核心类。