2013-03-15 99 views
9

我有一个iPhone应用程序中的哪一类一个一个子类的UIViewController我该如何从多个超类继承自定义类?

enter image description here

现在我正在制作新的应用程序,其中我想重新使用,但它从,这是很好的继承,因为子从的UIViewController

enter image description here

但现在我有另一个类,Ç,这是一个子类GLKViewController

enter image description here

问题是当我试图让第三应用程序,它重新使用B没有任何更改。由于B,从的UIViewController继承,我需要以某种方式告诉Ç,它应该继承GLKViewController,我相信这是多重继承的情况:

enter image description here

从我正在阅读中,处理此问题的最佳方法是与组合,但我不明白如何最好地将其应用于我的情况ñ。

作为一个独立的解决方案,我意识到我可以只创建一个包装d,我可以再修改上的应用程序逐个应用程序的基础,从手头的任务适当的超类的子类:

enter image description here

enter image description here

但是,这似乎有点哈克。有一个更好的方法吗?

+0

什么是UIScrollViewController? – jrturton 2013-03-15 19:17:48

+1

如何在UIViewController上使用类别而不是子类化?由于UIScrollViewController继承自UIViewController,因此您的类别也可用于UIScrollViewController的实例。噢,真的很好的问题+1! – Till 2013-03-15 19:22:10

+3

你不能这样做,在Objective-C是单继承 - 像Java 使用的成分或代表团 – 2013-03-15 19:34:19

回答

7

Objective C只支持单继承。在这种情况下,你可能想使用协议来实现通用功能。您可以使用助手对象来实现协议方法。在这种情况下,您对对象是否是特定类的成员不感兴趣,但是它是否实现了一组特定的方法。

+1

当你说“你对你的对象是否是特定类的成员不感兴趣”时,我很好奇你指的是哪一类 - UIViewController或B?因为我很确定我真的有兴趣将它作为这两个类的一部分,无论是在访问实例变量和方法方面。 – todd412 2013-03-16 16:29:45

+0

正确,协议允许类似的功能多重继承。不幸的是,他们不允许默认的实现,这往往会导致代码重复,而不是那些依赖类集群(辅助对象,就像你称之为的)那样不那么优雅的解决方案。无论如何,从外部来看,这可能是一个很好的替代品。 – Till 2013-03-17 02:52:34

3

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

使用的成分或代表团的范例

+0

固定 - 从评论 – 2013-03-15 22:08:11

+1

删除ios ...我删除了可能苛刻的听起来的评论...:D – Till 2013-03-16 03:41:50

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]; 
... 

注意,这样的分类也有其局限性。要了解更多信息,如何进一步研究该主题。


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

+0

谢谢,我不确定一个类别会在这里做诡计 - 我的课A依靠继承B和UIViewController(或GLKViewController)的实例变量和实例方法,A也成为.xib文件的文件所有者。所以目前还不清楚一个类别是否可以完成所有这些事情。 – todd412 2013-03-16 16:32:48