0

私の質問は、「異なるサブクラスを処理し、両方の基本クラスのメソッドにアクセスするジェネリック関数を実装するにはどうすればよいですか?」です。

次のような構造の架空のグラフィックス ライブラリを使用していると想像してください。

class Shape
{

// getters and setters are here

private:
   int m_BorderColor;
   int m_FillColor;
}

class Square : public Shape
{

}

class Triangle : public Shape
{

}

class TextBox : public Shape
{

}

... 等々。

このライブラリは、Shape 基本クラスの派生物を仮想キャンバスに追加することのみを許可します。私のアプリケーションでは、すべての図形と、場合によってはその他の属性にテキスト ボックスを配置したいと考えています。

したがって、次のような独自の基本クラスが必要です。

class MyBase
{
public:
    SetText (string text) { m_Text.Text = text; }
    // other getters and setters here

private:
    TextBox m_Text;
    int m_Id;
}

次に、次のように、テキスト ボックスを使用して「自分の」図形を作成できます。

class MySquare : public Square, public MyBase
{

}

MySquare は Shape のサブクラスであるため、キャンバスに追加できます。ユーザーが MySquare (または MyTriangle など) をダブルクリックすると、テキストを変更したいと思います。しかし、実行時にクリックされた形状しかわかりません。

SetText は Shape のメンバーではなく、ライブラリから受け取るポインターは (たとえば) MyTriangle にキャストされているにもかかわらず、Shape にキャストされるため、次の例は明らかに機能しません。

// double click handler
Shape* clicked_shape = clickEvent.GetShape();
clicked_shape->SetText("Foo");

実行時までどのシェイプ オブジェクトを取得するかわからないため、基本クラス ポインターを使用する必要があります。したがって、以下は問題なく機能しますが、私にとっては役に立ちません。

// double click handler
Shape* clicked_shape = clickEvent.GetShape()
((MyTriangle*)clicked_shape)->SetText("Foo")

この問題に対する洞察やより良いパターンをありがとうございます!

4

2 に答える 2