如何从多个超类继承自定义类?

时间:2013-03-15 19:16:01

标签: ios inheritance uiviewcontroller

我有一个iPhone应用程序,其中 A 类是 UIViewController 的子类:

enter image description here

现在我正在创建一个新应用,其中我想重新使用 A ,但是从 B 获得子类,这很好,因为 UIViewController 的 子类:

enter image description here

但现在我有另一个类 C ,它是 GLKViewController 的子类:

enter image description here

当我尝试制作第三个重复使用 B 的应用而没有任何更改时,问题就出现了。由于 B 继承自 UIViewController ,我需要以某种方式告诉 C 它应该继承自 B 和来自 GLKViewController ,我认为这是多重继承的情况:

enter image description here

从我正在阅读的内容来看,处理此问题的最佳方法是使用撰写,但我不明白如何最好地将其应用于我的情况。

作为一个替代解决方案,我意识到我可以创建一个包装 D ,然后我可以逐个应用地修改它来从子类化适合手头任务的适当超类:

enter image description here

enter image description here

但这看起来有点像hacky。有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

Objective C仅支持单继承。在这种情况下,您可能希望使用协议来实现常见功能。您可以使用辅助对象来实现协议方法。在这种情况下,您不关心您的对象是否是特定类的成员,而是它是否实现了一组特定的方法。

答案 1 :(得分:3)

你不能在Objective-C中做到这一点是单继承 - 比如java或大多数其他现代语言。

使用组合或授权的范例

答案 2 :(得分: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];
...

请注意,此类别确实有其限制。要了解更多信息,请进一步研究该主题。


总的来说,我认为“最”正确的答案是使用协议尽可能接近多重继承,正如Mike C.在他的回答中起草的那样。我的答案主要是针对简单案例的解决方法。