1

例:

class IGui{
  protected:
  virtual bool OnClicked(){return false;}
  virtual bool OnHover(){return false;}
  virtual bool OnScrollBarChange(){return false;}
  virtual bool OnTextChange(){return false;}

  ...

}

class IGuiButton: public IGui{
  protected:

  virtual bool OnClicked() = 0;
  virtual bool OnHover(){
    do stuff
    return true;}
  ...
}

ポイントは、(すべての仮想をオーバーライドする必要があるわけではありません) すべての GUI タイプに共通のインターフェイスを用意し、ボタンに軽量の特殊化を提供することですが、ボタンの場合、OnClicked のオーバーライドが必要です。

また、ボタンがプライベートをオーバーライドしてはならないものを作成する必要があると思います(したがって、プライベート継承を使用し、特定のものを保護するために「Base::Method; を使用する」という手の込んだものを使用しますか?

4

2 に答える 2

5

質問には複数の側面があります。最初の質問は、実際には非常に興味深い質問です。

派生クラスは、ベースでは純粋ではない純粋仮想メソッドを持つことができますか?

答えはイエスです。予想される (これが機能すると予想した場合) セマンティクス: 中間型から派生した型は、抽象型ではない仮想関数を実装する必要があります。これは、ベースが抽象ではなく、派生型が...という奇妙な状況につながります。これは驚くべきことです。このためだけに、私はデザインでこれを避けます。

private派生型がオーバーライドしてはならないメンバーとしてマークする必要がありますか?

いいえ、そうする理由も利点もありません。メンバー関数がpublicであるprotectedか、private派生クラスがそれをオーバーライドできるかどうか。基本型を介して関数を呼び出すことができるコードは、基本型にキャストすることで呼び出すことができます。これは、設計に別の奇妙な点をもたらします。基本クラスは仮想関数で満たされてprotectedいます。つまり、それらは派生型によってのみアクセス可能です。これはインターフェースを定義しないため、そのままでは使用できません。関数/クラスがIGui、またはへの参照を取る場合IGuiButton公開インターフェースがないため、多くのことはできません。これは基本的に、イベント ハンドラーへのアクセスを提供するためにフレンドシップを悪用している場合を除き、誰もイベントを呼び出すことができないことを意味しますが、これは避ける必要があります。

では、適切な設計とはどのようなものでしょうか。

さまざまな代替手段があります。独自のスクエア ホイールを作成する前に、過去に発明されたホイールを確認することをお勧めします。さまざまなグラフィカル フレームワークとライブラリを見て、それらがそのように設計された理由を理解しようとします。違いを見て、それらがもたらす利点/欠点と、どのオプションが問題に一致するかを判断してください。UI は多くの先行技術が存在する領域であり、その分野の人々が過去に行ったものよりも優れたものをゼロから設計することはおそらくないでしょう -- できるかもしれませんが、失敗するのははるかに簡単です。他の誰もが以前に感じたのと同じ落とし穴。

于 2012-09-10T01:06:15.353 に答える
0

あなたがやろうとしていることはデザインが悪いと思います。

最上位 (IGui) には「すべてが含まれている」ため、クラス階層を下に移動するときに効果的に情報を取り出しています。最上位には通常共通のものがありますが、下に移動するにつれて違いを追加します。

優れた設計によって得られる保護を失いつつあります。

于 2012-09-09T23:50:03.813 に答える