2011-10-05 85 views
0

是否有能力将基类插入到继承层次结构中? 下面是一个例子:在继承层次结构中插入类(objective-c)

@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 

我希望有一个具有的所有方法从ChildClass而是从BaseClassEx

继承

回答

0

听起来像多重继承。目标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 

现在你可以有四种东西。

  1. 一个BaseClass分配给它,它就像你的BaseClass。
  2. 分配给它的ChildUtility的BaseClass,就像你的ChildClass一样。它获得自定义的行为,并具有与BaseClass相同的界面。
  3. 分配给它的BaseUtility的BaseClassEx,它与BaseClassEx相似。它有额外的功能(我假设的额外接口)。
  4. 分配给它的ChildUtility的BaseClassEx,它就像您想要的ChildClassEx一样。它具有额外的功能和定制的功能。

类继承是“是”的模式。上述结合了“是”一个模式和“有一个”模式。为了得到你想要的ChildClassEx的效果,你做了“是”BaseClassEx,但是“有一个”ChildUtility。

+0

是的,我使用了这种解决方案:我声明指向BaseUtility的指针,并在额外的init方法中初始化它。这有一些缺点,因为BaseUtility需要访问内部BaseClass数据。 – brigadir

+0

考虑将BaseUtility需要访问的数据移动到BaseUtility中。 BaseUtility也可以有一些状态。但是也许BaseClass也会想要访问这些数据。有时您只需在其中一个或另一个中为数据创建访问点。 – morningstar

0

为什么不直接从ChildClass继承ChildClassEx?这继承了所有超类的所有内容

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

实际上我有两个孩子班。那就是为什么如果我从子类继承BaseClassEx,我需要复制它的代码(BaseClassEx1,BaseClassEx2)。从设计的角度来看,这个解决方案并不“美观”。 – brigadir

0

Objective-C上没有多重继承。但是,您可以使用几种不同的模式来实现类似的效果。只要你BaseClassEx只增加了新的方法(而不是试图重写现有BaseClass的方法的行为),最简单的事情是声明一个类

@interface BaseClass(BaseClassEx) 

// new method declarations 

@end 

@implementtion BaseClass(BaseClassEx) 

// new method definitions 

@end 

如果你这样做,BaseClass的所有实例将有新的方法。这适用于任何现有的类,甚至像NSString这样的东西。

+0

这会影响所有的课程。我不想改变BaseClass和ChildClass的行为。 – brigadir