如何从多个类继承

时间:2009-09-02 03:43:04

标签: objective-c

假设我有一个需要成为猫科和鸟类一部分的格里芬物体。
我该怎么做? 我只能让它一次从1个类继承......

5 个答案:

答案 0 :(得分:14)

这可能会有所帮助......

多重继承

  • 没有天生的多重继承(当然有些人认为这是一种好处)。要绕过它,您可以创建一个复合类,即一个具有实例变量的类,这些实例变量是其他对象的ID。实例可以专门将消息重定向到它们所组合的对象的任何组合。 (这不是那么麻烦,你可以直接控制继承物流。)[当然,这不是“绕过没有多重继承的问题”,而只是在这样的情况下模拟你的世界略有不同你不需要多重继承的方式。]

  • 协议在某种程度上解决了多重继承(MI)的缺失:从技术上讲,协议相当于纯粹“抽象”类的MI(参见下面“协议”的答案)。

  • [代表团如何适应这里?委托正在以该类设计者预期的方式扩展类的功能,而不需要子类化。当然,人们可以成为不同类别的几个对象的代表。 ]

- 来自http://burks.brighton.ac.uk/burks/language/objc/dekorte/0_old/intro.htm

答案 1 :(得分:7)

不支持Objective C中的多重继承。不支持这种机制的原因可能是,在语言中包含它太困难,或者作者认为这是一个糟糕的编程和设计决策。但是,在各种情况下,多重继承证明是有帮助的。幸运的是,Objective C确实提供了一些实现多重继承的解决方法。以下是选项:

选项1:邮件转发

Message Forwarding,顾名思义,是Objective C运行时提供的一种机制。当消息传递给对象并且对象没有响应它时,应用程序崩溃。但是在崩溃之前,目标c运行时为程序提供了第二次机会将消息传递给实际响应它的正确对象/类。在跟踪消息直到最顶级的超类之后,将调用forwardInvocation消息。通过重写此方法,实际上可以将消息重定向到另一个类。

示例:如果有一个名为Car的类具有名为carInfo的属性,该属性提供汽车的品牌,型号和制造年份,而carInfo包含NSString格式的数据,那么NSString类方法可能会非常有用调用实际上从NSObject继承的Car类的对象。

- (id)forwardingTargetForSelector:(SEL)sel
{
    if ([self.carInfo respondsToSelector:sel]) return self.carInfo;
    return nil;
}

来源:iOS 4开发者的食谱 - Erica Sadun

选项2:合成

组合是一种可可设计模式,它涉及引用另一个对象并在需要时调用其功能。组合实际上是一种基于其他几个视图构建自身的技术。因此,在Cocoa术语中,这与Subclassing非常相似。

@interface ClassA : NSObject {
}

-(void)methodA;

@end

@interface ClassB : NSObject {
}

-(void)methodB;

@end

@interface MyClass : NSObject {
  ClassA *a;
  ClassB *b;
}

-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;

-(void)methodA;
-(void)methodB;

@end

来源:Objective-C multiple inheritance

选项3:协议

协议是包含由实现协议的其他类实现的方法的类。一个类可以实现尽可能多的协议,并且可以实现这些方法。但是,使用协议只能继承方法而不是实例变量。

答案 2 :(得分:3)

你本身不能。但是您可以根据需要引用任意数量的其他对象,并且可以使用多个协议。

答案 3 :(得分:3)

您可以在运行时动态创建一个类,并选择要继承的每个父类的方法。查看有关动态创建类的NeXT运行时文档here。我之所以这样做只是为了好玩,但我没有走得太远,因为它很快变得非常混乱。

修改

虽然变得更加困难,因为只能有一个超类,否则关键字super会变得模棱两可。

答案 4 :(得分:1)

首先,将猫科视为鸟类的一个子类。小菜一碟。 : - )