2011-08-03 15 views
0

問題の説明:OOP C++:パターン:一部は同じメソッドを持つ2クラス

私は次のような2つのクラスを実装する必要があります。

class A1 { 
common_method1(); 
common_method2(); 
foo1(); 
}; 

class A2 { 
common_method1(); 
common_method2(); 
foo2(); 
}; 

foo1のを()とfoo2は()が異なっています論理。
foo1()とfoo2()には、異なるargと戻り値があります。
一般的なメソッドは同じORです。

対象: A1またはA2オブジェクトを生成できるファクトリを実装すること。
factory :: create()の呼び出し後、生成されたオブジェクトの型にそれぞれfoo1()またはfoo2()メソッドを使用します。

質問 C++/CLIでこのようなロジックを実装するにはどうすればよいですか?

感謝!

答えて

2

これは間違いなく標準的な継承パターンだと思います。 common_method1common_method2を実装する基本クラスParentを作成します。 Parentを継承するクラスA1A2を作成します。

あなたがA1またはA2のいずれかでcommon_method1またはcommon_method2のいずれかの方法でいくつかの特別なケースを実行する必要がある場合は、方法Parentvirtualを作ります。

それぞれA1およびA2foo1およびfoo2を実装します。

編集:私が正しく理解している場合は、Parentタイプのリファレンス(抽象クラ​​ス)を返すファクトリを作成する必要があります。あなたはいつもfoo1A1オブジェクト、およびfoo2A2上のオブジェクトに、単にA1でオーバーライド、Parentインタフェース、仮想メソッドbarを作成したい場合は、単にfoo1呼びます、そして、A2でオーバーライド、単にfoo2を呼び出します。

+0

コードを再利用するために継承を使うべきではありません。 – n0rd

+0

誰が言った?これは継承を使用するときの学校の例です... –

+0

2 Erik:うん。すばらしいです!私はちょうど同じことを考えました。実装... – DaddyM

2

私は、共通の機能を実装する基本クラスを作成します。継承を使用して最終的なクラスを作成します。

あなたの工場では、基本クラスへのポインタを返すことができます。このクラスには、型を判別するメソッドが含まれています。または、必要に応じてキャストすることもできます。

+0

dynamic_cast (タイプ)は、タイプがA2でない場合はNULLになります。これは、導出された型を決定する最も単純で誤差の少ないアプローチである。 – reece

+0

基本クラスを抽出してファクトリを作成し、その次のことがオブジェクトの具象クラスを決定し、具象クラスポインタへの基本クラスポインタをキャストしている場合、そのクラスのオブジェクトへのポインタを返すのは何ですか? – n0rd

+0

2 reece:dynamic_cast usageは悪いデザイン(Steven Dewhurst)の影響です。 dynamic_castのないケースを検討してみましょう – DaddyM

0

あなたの例について他のことは分かりませんが、私はあなたがよく使うメソッドを含むマスタークラスを作成し、それらをいくつかの基本クラスに継承したいと思うでしょう。 多態性を使用して、foo1()またはfoo2()を呼び出すことができます。 polymorphismにあるこのサイトは、古典的な円/四角形のdraw()の例を使用しているので、助けになるかもしれません。

+0

ありがとう!非常に便利なリンク – DaddyM

0

次のような階層構造を持っている場合があります:

#include <iostream> 

struct A_Base { 
    // You can put your other common method here 
    virtual void common_method(); 
    virtual ~A_Base(); 
} 

struct A1 : A_Base { 
    void foo1(); 
}; 

struct A2 : A_Base { 
    void foo2(); 
}; 

struct Factory { 
    // I'm just using an int for the condition, 
    // but you can use anything 
    A_Base *CreateA(int i) { 
     if(i == 1) return new A1; 
     if(i == 2) return new A2; 
    } 
}; 

int main() 
{ 
    Factory f; 

    // Create an object 
    A_Base *pb = f.CreateA(1); 

    A1 *pa1; 
    A2 *pa2; 

    // Run a common method 
    pb->common_method(); 

    // Check the runtime type 
    // (not really necessary, but you might need it) 
    if(pa1 = dynamic_cast<A1*>(pb)) { 
     pa1->foo1(); // Run the unique method 
    } else if (pa2 = dynamic_cast<A2*>(pb)) { 
     pa2->foo2(); // Or run the other unique method 
    } 

    // Delete the pointer 
    delete pb; 
    return 0; 
} 

うん、私は終わり近くに、ここでRTTIを使用しています。本当に良い習慣ではありませんが、その基底を導出する方法を知る必要があるかもしれません。

+0

このような明確な答えをありがとう! – DaddyM

+0

@DaddyM - 問題ありません:) – Schnommus

関連する問題