OpenGLゲーム用の小さなGUIを作成しています。2つの基本クラスWidget
とがありContainer
ます。Widget
クラスには、、、 ...のようなsetPosition(x,y)
メソッドsetSize(w,h)
があります。これらのメソッドは、から派生したクラスに対してのみ表示されますContainer
。
編集:フレンドメソッドとラッパーメソッドを使用して実行できますが、ラッパーなしで実行したいと思います。
OpenGLゲーム用の小さなGUIを作成しています。2つの基本クラスWidget
とがありContainer
ます。Widget
クラスには、、、 ...のようなsetPosition(x,y)
メソッドsetSize(w,h)
があります。これらのメソッドは、から派生したクラスに対してのみ表示されますContainer
。
編集:フレンドメソッドとラッパーメソッドを使用して実行できますが、ラッパーなしで実行したいと思います。
コメントから提案が明確でない場合は、そのメソッドのサブセットを使用してインターフェイスを作成し、.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 フォワーダーを更新する必要はなく、適切なインターフェイスへのアクセサーだけです)。
高レベルの設計の観点からは、 aWidget
はDrawable
一般的ではなく、 orDrawable
のコンテキストからのみです。Widget
Container
私の意見では、これは「他のプログラマーが間違ったことをしたときに汚いと感じさせるにはどうすればよいか」というような状況の 1 つです。混乱を招く傾向があるためです。私の意見では、フレンド コンテナー デリゲートのセットアップは、日常の「これはどのように機能するのか」という状況でコードを理解しようとする人々を混乱させるだけです。「これをハックする必要がある」状況でコードを悪用するのを難しくしたい。
私がすることは、おそらく文書化して(パブリック)関数を呼び出すのと同じくらい簡単なこと_setPosition
です_setSize
。アンダースコアは (願わくば) 他のプログラマーを「何???」と思わせるでしょう。Container
ドキュメントを読んでください。これにより、非s がこれらの関数を呼び出すことが非常に悪い考えである理由が正確に説明されます。
少し醜いですが、それがポイントです。rect._setPosition
何が起こっているのか理解できないまま電話をかけたのは確かに汚いと感じるでしょう。これは心理的な解決策ですが、アクセス保護機能が欠けている他の言語 (Javascript など) で多く使用されているため、ひどく醜いほど珍しいものではありません。または、少なくとも、言語の機能で要件を指定しようとするよりもひどく醜いことはありません:)
あまりにも明白に思えるので、この回答を書くのが怖いのですがsetPosition(x,y)
、setSize(w,h)
のメンバーを作成できませんでしたContainer
か?
または、ある種の未知の複雑さがある場合は、WidgetContainer
を基本クラスとして作成し、それらのメソッドをそのクラスに入れることができますか?