0

OpenGLゲーム用の小さなGUIを作成しています。2つの基本クラスWidgetとがありContainerます。Widgetクラスには、、、 ...のようなsetPosition(x,y)メソッドsetSize(w,h)があります。これらのメソッドは、から派生したクラスに対してのみ表示されますContainer

編集:フレンドメソッドとラッパーメソッドを使用して実行できますが、ラッパーなしで実行したいと思います。

4

3 に答える 3

2

コメントから提案が明確でない場合は、そのメソッドのサブセットを使用してインターフェイスを作成し、.NET でプライベート継承を使用することを検討できますWidget。次に、保護された (単一の操作) を使用して、それからContainer派生したクラスのプライベート インターフェイスを取得します。

struct Drawable {    // choose a better name
  virtual void setPosition( int x, int y );
  virtual void setSize( int w, int h );
  virtual ~Drawable() {}
};
class Widget : private Drawable {
   friend class Container;
};
class Container {
protected:
    Drawable& getDrawable( Widget& w ) { return w; };
};
class MyContainer : public Container {
   void changeSize( Widget & w ) {
      getDrawable(w).setSize(10,20);
   }
};

転送オプションとの主な違いは、関数の数に応じてスケーリングしやすく、保守しやすいことです (N フォワーダーを更新する必要はなく、適切なインターフェイスへのアクセサーだけです)。

高レベルの設計の観点からは、 aWidgetDrawable一般的ではなく、 orDrawableのコンテキストからのみです。WidgetContainer

于 2012-07-16T17:56:58.953 に答える
1

私の意見では、これは「他のプログラマーが間違ったことをしたときに汚いと感じさせるにはどうすればよいか」というような状況の 1 つです。混乱を招く傾向があるためです。私の意見では、フレンド コンテナー デリゲートのセットアップは、日常の「これはどのように機能するのか」という状況でコードを理解しようとする人々を混乱させるだけです。「これをハックする必要がある」状況でコードを悪用するのを難しくしたい。

私がすることは、おそらく文書化して(パブリック)関数を呼び出すのと同じくらい簡単なこと_setPositionです_setSize。アンダースコアは (願わくば) 他のプログラマーを「何???」と思わせるでしょう。Containerドキュメントを読んでください。これにより、非s がこれらの関数を呼び出すことが非常に悪い考えである理由が正確に説明されます。

少し醜いですが、それがポイントです。rect._setPosition何が起こっているのか理解できないまま電話をかけたのは確かに汚いと感じるでしょう。これは心理的な解決策ですが、アクセス保護機能が欠けている他の言語 (Javascript など) で多く使用されているため、ひどく醜いほど珍しいものではありません。または、少なくとも、言語の機能で要件を指定しようとするよりもひどく醜いことはありません:)

于 2012-07-16T17:28:55.693 に答える
1

あまりにも明白に思えるので、この回答を書くのが怖いのですがsetPosition(x,y)setSize(w,h)のメンバーを作成できませんでしたContainerか?

または、ある種の未知の複雑さがある場合は、WidgetContainerを基本クラスとして作成し、それらのメソッドをそのクラスに入れることができますか?

于 2012-07-16T17:21:37.087 に答える