2011-06-27 8 views
0

私のプログラムには、基本Objectクラスとベクトルがあります。私は各Object *で実行したい操作を持っていますが、操作はObject *の最も派生したクラスに依存しています。したがって、訪問者のパターンを使用します。しかし、私は訪問者のパターンが大量のカップリングにつながることを発見しました。私は新しいObject派生クラスを追加するたびに、基本VisitorとVisitorから派生するすべてのクラスを変更する必要があります。リスト内のオブジェクトは、ベースタイプではなくランタイムタイプに基づいてどのように操作しますか?

このような高い結合性につながりません実行時の種類に基づいてオブジェクトのリストに対して操作を実行する簡単な方法はありますか?

+0

仮想関数はどうですか? –

+0

あなたは、オブジェクトで何をしたいのかについての詳細や例を教えてください。 – Anton

+0

派生クラスの操作のセットを実行時に変更できるように指定していませんでした。訪問者は、一連の操作を1つのクラスにカプセル化します。このクラスは実行時にサブクラス化および切り替えが可能です。 –

答えて

1

私は線の間を読んで、最も派生したオブジェクトには固有のメンバー関数があり、他の派生オブジェクトには存在しないと推測しますそれらを基本クラスに追加します。

dynamic_castを使用して、ポインタが最も派生したクラスに属しているかどうかを確認し、そうであれば関数を呼び出します。

MyBase * pBase = *iterator; 
MyDerived * pDerived = dynamic_cast<MyDerived *>(pBase); 
if (pDerived != NULL) 
    pDerived->UniqueMethod(); 
0
任意の仮想関数が行います

...

Object* obj; 
//... 
obj->doOperation(); 
2
class Object 
{ 
    virtual void action() = 0; 
    /* ... */ 
}; 

void objectAction(Object * o) { o->action(); } 

int main() 
{ 
    std::vector<Object*> v; 
    std::for_each(v.begin(), v.end(), objectAction); 
} 

今だけ各派生クラスでactionを実装します。

0

抽象基本クラス(「オブジェクト」と呼ぶ)は、各継承クラスが実装する必要がある抽象実装フレームワークを提供します。基本クラスの各インスタンスに対して適切なメソッドを呼び出すだけです。それにそこにあるおよそすべてです

public abstract class Widget 
{ 
    public void MandatoryMethod() ; // no method implementation 
} 

public class FooConcreteWidget : Widget 
{ 
    public override void MandatoryMethod() 
    { 
    // some concreted implementation 
    } 
} 
public class BarConcreteWidget : Widget 
{ 
    public override void MandatoryMethod() 
    { 
    // another concrete implementation 
    } 
} 

... 
List<Widget> Widgets = GetSomeWidgets() ; 

for (Widget widget in Widgets) 
{ 
    widget.MandatoryMethod() ; 
} 

:この(C#で、私のC++はかなり腐食しているが、あなたのアイデアを得る必要があるため)のようなもの。

関連する問題