Iphone 在目标C中需要多重继承

Iphone 在目标C中需要多重继承,iphone,objective-c,inheritance,uiview,multiple-inheritance,Iphone,Objective C,Inheritance,Uiview,Multiple Inheritance,我想实现一个可移动的UIView类(当您触摸并移动手指时,视图会移动),例如: 在没有多重继承的情况下,如何将此代码应用于UILabel、UIButton等?在C++中,我会这样做(用UIVIEW作为VababeVIEW的虚拟基础): 类别是作为多重继承的替代方案提供的,但我肯定不想使用类别扩展UIView,因为这将适用于我的应用程序中的所有视图。我只希望我的一些观点是可移动的 我目前避免代码重复的策略是将MovableView代码放在头文件中,并在每次我需要某个类来使用它时都包含它。除此之外,

我想实现一个可移动的UIView类(当您触摸并移动手指时,视图会移动),例如:

在没有多重继承的情况下,如何将此代码应用于UILabel、UIButton等?在C++中,我会这样做(用UIVIEW作为VababeVIEW的虚拟基础):

类别是作为多重继承的替代方案提供的,但我肯定不想使用类别扩展UIView,因为这将适用于我的应用程序中的所有视图。我只希望我的一些观点是可移动的

我目前避免代码重复的策略是将MovableView代码放在头文件中,并在每次我需要某个类来使用它时都包含它。除此之外,我必须将MovableView的成员添加到我正在编写的任何类中。这是纯粹的代码丑陋,但总比在我的项目中复制/粘贴代码要好

有没有人有其他想法来绕过这个目标C限制[没有多重继承]

谢谢


Altan

Objective-C不允许您执行这种mixin继承操作,除非将相同的类别添加到您想要扩展的每个类中。然后,您就不会得到额外的实例变量


对于您的特定问题,我可以通过将
MovableView
设计为一个容器类来解决,该容器类只是一个对象,它有一个子视图(UILabel、UIButton等),您希望将其作为子视图移动。

类别无论如何都不会有帮助,因为在UIButton上替换real TouchesStart方法会非常糟糕。。。您不能从类别中调用[super]

另一种解决方案是向这些类定义中注入一个方法,如下所示:

Method origMethod = class_getClassMethod([UIButton class], @selector(touchesBegan));
Method newMethod = class_getClassMethod([TemplateClass class], @selector(replacementTouchesBegan));
method_exchangeImplementations(origMethod, newMethod);
但这很微妙。虽然如果它真的是你想去的地方,它是值得研究的

我要做的是创建一个继承自UIView的MovableView类,然后简单地添加任何您想要的MovableView作为该视图的子视图(我认为这可能与吉诃多所说的略有不同,如果没有,我很抱歉)。它首先对触摸做出反应,然后将不需要的任何东西传递给下一个响应者。。。无需使用单个子视图构建特殊类。然后在IB中,你可以把这些可移动的视图放在任何地方,并把东西放在其中


一般的合成技术,如UIKIT,而不是修改核心类,非常方便。

有一个很好的理由禁止多重继承:在旧的C++时代,这种技术导致依赖性地狱,在现代松散耦合中,你想避免任何依赖性的HeleGoice想法,Quixoto。在Interface Builder中多做一点工作,但减少类和编码。可能重复
struct MovableLabel : UILabel, MovableView {};
Method origMethod = class_getClassMethod([UIButton class], @selector(touchesBegan));
Method newMethod = class_getClassMethod([TemplateClass class], @selector(replacementTouchesBegan));
method_exchangeImplementations(origMethod, newMethod);