2011-10-05 10 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からのすべてのメソッドを持っていますが、ちょうど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 

これで4種類のことができます。

  1. BaseClassには、BaseClassに似たBaseUtilityが割り当てられています。
  2. ChildClassに似ているChildUtilityが割り当てられたBaseClass。カスタマイズされた動作を得て、BaseClassと同じインターフェースを持っています。
  3. BaseClassExにBaseUtilityが割り当てられています。これは、BaseClassExと似ています。それは余分な機能を持っています(私が推測する余分なインターフェイス)。
  4. ChildClassExにはChildUtilityが割り当てられています。これはChildClassExと似ています。追加の機能とカスタマイズされた機能があります。

クラス継承は "is a"パターンです。上記は "is a"パターンと "has a"パターンの両方を組み合わせたものです。あなたが望むChildClassExの効果を得るために、あなたは "BaseClassEx"であるが、 "ChildUtility"を持つものを作ります。

+0

はい私はこの種の解決策を使用しました:BaseUtilityへのポインタを宣言し、追加のinitメソッドで初期化します。 BaseUtilityは内部BaseClassデータにアクセスする必要があるため、これにはいくつかの欠点があります。 – brigadir

+0

BaseUtilityがアクセスする必要があるデータをBaseUtilityに移動することを検討してください。 BaseUtilityにもいくつかの状態があります。しかし、おそらくBaseClassもそのデータにアクセスしたいと思うでしょう。場合によっては、データのアクセスポイントを一方または他方に作成するだけでよい場合もあります。 – morningstar

0

から継承されChildClassExをしたいですか?これは、すべてのスーパークラスからすべてを継承します。

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

実際には2つの子クラスがあります。その理由は、私が子クラスからBaseClassExを継承すると、コード(BaseClassEx1、BaseClassEx2)を複製する必要があるのです。そして、このソリューションはデザインの観点からは「美しい」ものではありません。 – brigadir

0

Objective-Cに多重継承はありません。ただし、同様の効果を得るために使用できるパターンはいくつかあります。限り、あなたのBaseClassExが唯一の新しいメソッドが追加されます(既存のBaseClassのメソッドの動作を上書きしようとしない)として、最も簡単な方法は、あなたがこれを行う場合は、BaseClassののすべてのインスタンスがするカテゴリ

@interface BaseClass(BaseClassEx) 

// new method declarations 

@end 

@implementtion BaseClass(BaseClassEx) 

// new method definitions 

@end 

を宣言することです新しい方法があります。これはNSStringのような既存のクラスでも機能します。

+0

これはすべてのクラスに影響します。私はBaseClassとChildClassの振る舞いを変えたくありません。 – brigadir

関連する問題