【问题标题】:How can I have a custom class inherit from multiple superclasses?如何让自定义类从多个超类继承?
【发布时间】:2013-03-15 19:16:01
【问题描述】:

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

现在我正在创建一个新应用程序,我想在其中重用 A,但将它从 B 子类化,这很好,因为 B 个来自 UIViewController 的子类:

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

当我尝试制作第三个重复使用 B 而不做任何更改的应用时,问题就来了。由于 B 继承自 UIViewController,我需要以某种方式告诉 C 它应该继承自 B 并且来自 GLKViewController,我认为这是一个多重继承的例子:

根据我的阅读,处理此问题的最佳方法是使用 composition,但我不明白如何最好地将其应用于我的情况。

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

但这似乎有点老套。有没有更好的方法来做到这一点?

【问题讨论】:

  • 什么是 UIScrollViewController?
  • 在 UIViewController 上使用类别而不是子类化怎么样?由于 UIScrollViewController 继承自 UIViewController,因此您的类别也可以在 UIScrollViewController 实例的情况下使用。哦,这个问题的起草非常好 +1!
  • 你不能在 Objective-C 中做到这一点是单继承——就像 java 使用组合或委托的范例
  • @Daij-Djan 我的意思是说你写它的方式是不正确的。对于所问问题的具体情况,您的结果是正确的。您对 iOS 不支持多重继承概念的广泛陈述是不正确的——如果您像现在一样坚持使用 Objective-C,那么您是正确的。请不要感到受到攻击——这不是我的本意。
  • @Till 你的论点非常听起来像是吹毛求疵。所有现代编程语言都变得完整的事实意味着您可以用其他所有语言来表达每种语言。这导致了一个结论,即到处都支持多重继承。它只是没有帮助,就像在这种特定情况下(子类化 Cocoa-Touch 类),我觉得声明是明智的:不支持多重继承。

标签: ios inheritance uiviewcontroller


【解决方案1】:

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

【讨论】:

  • 我很好奇当你说“你对你的对象是否是特定类的成员不感兴趣”时你指的是哪个类——UIViewController 还是 B?因为我很确定我实际上对它成为这两个类的一部分感兴趣,无论是在访问实例变量和方法方面。
  • 正确,协议允许与多重继承类似的功能。不幸的是,它们不允许默认实现,这通常会导致代码重复 pr 依赖于类集群(帮助对象,如您所说)的不太优雅的解决方案。无论如何,从外部角度来看,这可能是一个很好的替代品。
【解决方案2】:

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

使用组合或委托的范式

【讨论】:

  • 已修复 -- 从评论中删除 ios
  • ...我删除了可能听起来很刺耳的评论...:D
【解决方案3】:

您可以通过使用类别来涵盖这些内容。它当然与多重继承不同,但有时可以。

让我为一个类别起草一个示例,看看它是否符合您的目标。

标头: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. 在他的答案中所起草的那样。我的回答主要是针对简单情况的解决方法。

【讨论】:

  • 谢谢,我不确定类别是否能解决问题——我的类 A 依赖于从 B 和 UIViewController(或 GLKViewController)继承实例变量和实例方法,而 A 也变为.xib 文件的文件所有者。因此,尚不清楚一个类别是否可以完成所有这些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多