1

2 つのクラス A と B があるとします。どちらもスーパークラスである C のサブクラスです。ここで、C がメソッド areYouA() を定義していると仮定しましょう。これは、オブジェクトが A クラスのオブジェクトであるかどうかをオブジェクトに尋ねるメソッドです。

したがって、C++ で考えられるコードは次のようになります。

C object1 = A()

C object2 = B()

if (object1.areYouA()==true){//crazy code here regarding if it's an A object}

if (object2.areYouA()==false){//crazy code here regarding if it's a B object}

OO POV から、B クラスと C クラスにメソッドを追加して、それぞれのオブジェクトが A クラスかどうかを確認するのは正しいでしょうか? それが正しくない場合、これに対する別のアプローチは何でしょうか???? 私の目的は明らかです。必要な2つのクラスAとBがあり、ある時点でAクラスまたはBクラスのバイナリデータの一部があり、オブジェクトは最初はAクラスになります。完全に、構造を変更する必要があり、動作の一部も変更する必要があるため、B クラスのオブジェクトになります。したがって、これに対する私のアプローチは、抽象クラスを親として考え、最初に C オブジェクトを宣言して A オブジェクトを格納し、後で B オブジェクトを変更時に格納するというものでした。パターンのように、これに対する別のアプローチはありますか???

追加情報:

私はこれについてあまり明確ではなかったと思います。A オブジェクトからの情報を file1 に保存し、B オブジェクトからの情報を file2 に保存するとします。そのマザー クラスをインターフェイスとして使用する場合、それぞれのファイルに格納するオブジェクトが A オブジェクトか B オブジェクトかをどのように判断できますか?? 各オブジェクトに属するファイル名の属性も追加する必要がありますか??? つまり、ファイルの名前を変更する必要がある場合は、すべてのオブジェクトも変更する必要があります。

4

3 に答える 3

4

正しい方法は、仮想関数を使用してポリモーフィックな動作を実装することです。

struct C
{
    virtual void do_crazy_stuff() { } // (see text below)
    virtual ~C() { }                  // always have a virtual d'tor for polymorphic bases
};

struct A : C
{
    virtual void do_crazy_stuff() { /* your crazy code for A */ }
};

struct B : C
{
    virtual void do_crazy_stuff() { /* your crazy code for B */ }
};

どこでも同じインターフェイスを使用できるようになりました。

void process_data(C & x)  // <-- Note: take argument by reference!!
{
    x.do_crazy_stuff();
}

これは、から派生したタイプのオブジェクトで機能しますC

int main()
{
    A x;
    B y;
    process_data(x);  // calls x.A::do_crazy_stuff
    process_data(y);  // calls x.B::do_crazy_stuff
}

必要に応じて、基本関数C::do_crazy_stuffを純粋仮想として宣言することもできます。これにより、基本クラスが抽象化されます (したがって、インスタンス化できません)。

于 2012-05-06T16:18:46.563 に答える
4

最初に、

C object1 = A();
C object2 = B();

オブジェクトをスライスします。それらはもはやタイプAorBではありません。それらはCです。

これにはポインターを使用できます。

C* object1 = new A();
C* object2 = new B();

ポインタですが、それぞれCと のインスタンスを指します。AB

第二に、あなたのアプローチは間違っています。ポリモーフィズムを利用していないようです。クラス間で共有される機能がある場合は、 で実装する必要がありますC。変更する場合は、virtualメソッドが必要です。

通常、オブジェクトの型に関する知識は、少なくともコードの匂いです。ポリモーフィズムを使用するだけで、動作を変更できます。本当に必要な場合でも、正しい方法は次を使用することdynamic_castです。

C* object1 = new A();
A* pA = dynamic_cast<A*>(object1);

pAがtype のオブジェクトを指していないNULL場合になります。object1A

于 2012-05-06T16:18:59.280 に答える
1

これは私の意見では設計上の問題であり、問​​題をよりよく分析する必要があります。オブジェクトの型を知る必要があるのはなぜですか? A クラスと B クラスにインターフェイス メソッドを実装しないのはなぜですか? ビジターのデザイン パターンを見て、このように実装する方法のイメージをつかんでください。

于 2012-05-06T16:18:42.467 に答える