如何从多个类继承

CiN*_*iNN 6 objective-c

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

Kel*_*ron 14

这可能有帮助......

多重继承

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

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

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

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


Ani*_*pta 8

不支持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;
}
Run Code Online (Sandbox Code Playgroud)

来源: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
Run Code Online (Sandbox Code Playgroud)

来源:Objective-C多重继承

备选方案3:协议

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