我有一个iPhone应用程序,其中 A 类是 UIViewController 的子类:
现在我正在创建一个新应用,其中我想重新使用 A ,但是从 B 获得子类,这很好,因为 UIViewController 的 子类:
但现在我有另一个类 C ,它是 GLKViewController 的子类:
当我尝试制作第三个重复使用 B 的应用而没有任何更改时,问题就出现了。由于 B 继承自 UIViewController ,我需要以某种方式告诉 C 它应该继承自 B 和来自 GLKViewController ,我认为这是多重继承的情况:
从我正在阅读的内容来看,处理此问题的最佳方法是使用撰写,但我不明白如何最好地将其应用于我的情况。
作为一个替代解决方案,我意识到我可以创建一个包装类 D ,然后我可以逐个应用地修改它来从子类化适合手头任务的适当超类:
但这看起来有点像hacky。有更好的方法吗?
答案 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.在他的回答中起草的那样。我的答案主要是针对简单案例的解决方法。