代码之家  ›  专栏  ›  技术社区  ›  CiNN

如何从多个类继承

  •  6
  • CiNN  · 技术社区  · 15 年前

    假设我有一个狮鹫对象,它需要是猫科动物和鸟类类的一部分。
    我该怎么做?

    5 回复  |  直到 15 年前
        1
  •  14
  •   Kelly Robins    15 年前

    这可能有助于。。。

    多重继承

    • 协议在某种程度上解决了多重继承(MI)的缺失问题:从技术上讲,对于纯“抽象”类,协议等同于MI(见下文“协议”的答案)。

    • [委托如何适应这里?委托是以该类设计者预期的方式扩展该类的功能,而无需子类化。当然,一个人可以是不同类的多个对象的委托。]

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

        2
  •  8
  •   Community CDub    8 年前

    选项1:消息转发

    顾名思义,消息转发是Objective C运行时提供的一种机制。当一条消息被传递给一个对象而该对象没有响应它时,应用程序崩溃。但是在崩溃之前,objective c运行时为程序提供了第二次机会,将消息传递给实际响应它的适当对象/类。在跟踪消息直到最顶层的超类之后 forwardInvocation

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

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

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

    备选案文2:组成

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

    @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:议定书

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

        3
  •  3
  •   Devin Ceartas    15 年前

    从本质上说,你不能。但是,您可以根据需要引用任意多个其他对象,并且可以使用多个协议。

        4
  •  3
  •   Community CDub    4 年前

    here 关于动态创建类。我做过一次只是为了好玩,但我没走多远,因为它很快就变得非常混乱。

    编辑

    super 变得模棱两可。

        5
  •  1
  •   Alec    15 年前

    首先,让猫科动物成为鸟类的一个亚类。小菜一碟。:-)