最初の質問だから、私はStackOverflowコミュニティに効果的に参加し、質問に関係することについてアドバイスを受けています。新しいネストされたクラスを持つクラスを拡張する
私はC#でテキストベースのUIに取り組んでいます。私は抽象ウィンドウクラスと抽象コントロールクラスを持っています。それぞれは、それらを継承する型(例えば、ポップアップウィンドウやテキストボックスコントロール)のための共通の機能を実装しています。現在、ライブラリを実装するプログラム内では、開発者はウィンドウオブジェクトとコントロールオブジェクトを作成し、それぞれのウィンドウにコントロールを追加する必要があります。
var mainWindow = new MainWindow(...);
var textBox1 = new TextBox(...);
mainWindow.AddControl(textBox1);
WindowManager.Add(mainWindow);
これはうまくいきますが、ちょっと大変です。コントロールはウィンドウの外に存在する必要はないので、コントロールタイプをネストされたタイプとして実装したいと考えていました。しかし、プログラムの拡張性を維持するために、新しいコントロールタイプでウィンドウクラスを拡張する方法が必要です。私の質問はこれです:リフレクションを使用するか、コンテナクラスを使用して開発者がウィンドウクラスを拡張する必要がありますか?あるいは、現在どのようにレイアウトされているかよりも、プログラムを構成する良い方法がありますか?私もジェネリックを使用して考えられてきた
、例えば:
public abstract class Window : DrawableObject, IWindow
{
public void AddControl <T>(object[] constructorArgs) where T : class, IControl
{
}
}
私は拡張性/疎結合を犠牲にすることなく、実装の容易さを目指しています。どのような考えにも事前に感謝します!
EDIT:明らかにする必要があります。これは主にWindowsとコントロールの連携方法を変えることです。各コントロールには、特定のウィンドウの終了ボタンの作成など、さまざまな目的で、コントロールが存在するウィンドウにアクセスするために使用されるparentWindowプロパティがあります。
今、このプロパティはコンストラクタに渡されますが、それはあなたのコントロールリストにコントロールを追加しなければならないので、私には重複しているようです。私はコントロールがウィンドウに追加されたときにこのプロパティを設定する方法を見つけるが、parentWindowプロパティがこのコンテキスト外で変更された場合に潜在的な問題を防ぐためにコントロールが追加されたときにこのアクションを制限する。
私はあなたが実際にその一般的な方法を追加することで何を得ているのか分かりません。私がこれを使用していた場合は、私のオブジェクトを構築して、それを表示するようにウィンドウに指示したいと思うでしょう。 – Jonesopolis
あなたはそうです。アクティベーションアクションをサポートする各コントロールタイプは、コンストラクタ引数としてデリゲートの 'ControlAction(IControl source)'をとります。他のコントロールからの入力に基づいて1つのコントロールに対してStuffを実行できるようにすることは非常に便利です。ウィンドウの外でコンストラクトとリファレンスを制御します。私は作成されたコントロールへの参照を返すことができますが、それは冗長です。各コントロールは 'IWindow parentWindow'も取るので、コンストラクタコードのウィンドウにコントロールを追加するべきでしょうか?あるいは、ウィンドウに追加されたときにparentwindow propを設定することもできます。 – thetiniestmouse
コントロールの親ウィンドウをウィンドウに追加すると、それが最も意味があるように見えますが、親ウィンドウのセッターをパブリックにすることはできません。この場合、ウィンドウに追加するときだけ設定する必要があるからです。私はちょうどそれを愚かな証拠にすることはおそらく愚か者の使命であると思うが、それでも解決しなければならないかもしれない。 – thetiniestmouse