在继承层次结构中插入类(objective-c)

在继承层次结构中插入类(objective-c),objective-c,inheritance,Objective C,Inheritance,是否能够将基类插入继承层次结构? 以下是一个例子: @interface BaseClass // has a lot of basic functionality and interface {...} @end @interface ChildClass : BaseClass // customizes BaseClass functionality {...} @end @interface BaseClassEx : BaseClass // add some features t

是否能够将基类插入继承层次结构? 以下是一个例子:

@interface BaseClass // has a lot of basic functionality and interface
{...}
@end

@interface ChildClass : BaseClass // customizes BaseClass functionality
{...}
@end

@interface BaseClassEx : BaseClass // add some features to base class
{...}
@end

我想让ChildClassEx具有来自ChildClass的所有方法,但从BaseClassEx继承而来,为什么不直接从ChildClass继承呢?这将自动继承所有超类的所有内容

@interface BaseClassEx : ChildClass // add some features...
{...}
@end

听起来像是多重继承。目标C没有

根据您的描述,我建议采用不同的设计模式

@class BaseUtility // has a lot of basic functionality
{...}
@end

@class BaseClass // has interface
{...}
@property BaseUtility *utility;
@end

@class ChildUtility : BaseUtility // customizes basic functionality
{...}
@end

@class BaseClassEx : BaseClass // add some features to base class
{...}
@end
现在你可以有四种东西

  • 指定了BaseUtility的基类,类似于您的基类
  • 指定了ChildUtility的基类,类似于您的ChildClass。它获得定制的行为,并具有与基类相同的接口
  • 一个BaseClassEx,它被分配了一个BaseUtility,这与您的BaseClassEx类似。它有额外的特性(我想是额外的接口)
  • 一个BaseClassEx,它被分配了一个ChildUtility,就像您想要的ChildClassEx一样。它有额外的功能和定制的功能

  • 类继承是“is a”模式。上面结合了“是a”模式和“有a”模式。为了获得想要的ChildClassEx的效果,您可以制作一些“是”BaseClassEx,但“有”ChildUtility的东西。

    Objective-C上没有多重继承。但是,有几种不同的模式可以实现类似的效果。只要您的BaseClassEx只添加新方法(并且不试图覆盖现有基类方法的行为),最简单的事情就是声明一个类别

    @interface BaseClass(BaseClassEx)
    
    // new method declarations
    
    @end
    
    @implementtion BaseClass(BaseClassEx)
    
    // new method definitions
    
    @end
    

    如果这样做,基类的所有实例都将具有新方法。这适用于任何现有类,甚至像NSString这样的类。

    实际上,我有两个子类。这就是为什么如果我从子类继承BaseClassEx,我需要复制它的代码(BaseClassEx1,BaseClassEx2)。从设计的角度来看,这个解决方案并不“漂亮”。这将影响所有类。我不想改变基类和子类的行为。是的,我使用了这种解决方案:我声明指向BaseUtility的指针,并在附加的init方法中初始化它。这有一些缺点,因为BaseLoad需要访问内部BaseClass数据。考虑移动BaseValtuy需要访问BaseLoad的数据。BaseUtility也可以有一些状态。但是,基类可能也希望访问该数据。有时,您只需要在其中一个中为数据创建一个访问点。