9

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

在此处输入图像描述

现在我正在创建一个新应用程序,我想在其中重新使用A,但是让它从B子类化,这很好,因为BUIViewController子类化:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

作为一个替代解决方案,我意识到我可以创建一个包装器D,然后我可以逐个应用程序对其进行修改,以便从适当的超类中为手头的任务进行子类化:

在此处输入图像描述

在此处输入图像描述

但这似乎有点骇人听闻。有一个更好的方法吗?

4

3 回答 3

7

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

于 2013-03-15T22:15:39.417 回答
3

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

使用组合或委托的范式

于 2013-03-15T19:23:27.897 回答
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. 在他的答案中起草的那样。我的回答主要是针对简单情况的解决方法。

于 2013-03-15T20:59:32.153 回答