2016-05-02 8 views
0

最初の質問だから、私は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プロパティがこのコンテキスト外で変更された場合に潜在的な問題を防ぐためにコントロールが追加されたときにこのアクションを制限する。

+1

私はあなたが実際にその一般的な方法を追加することで何を得ているのか分かりません。私がこれを使用していた場合は、私のオブジェクトを構築して、それを表示するようにウィンドウに指示したいと思うでしょう。 – Jonesopolis

+0

あなたはそうです。アクティベーションアクションをサポートする各コントロールタイプは、コンストラクタ引数としてデリゲートの 'ControlAction(IControl source)'をとります。他のコントロールからの入力に基づいて1つのコントロールに対してStuffを実行できるようにすることは非常に便利です。ウィンドウの外でコンストラクトとリファレンスを制御します。私は作成されたコントロールへの参照を返すことができますが、それは冗長です。各コントロールは 'IWindow parentWindow'も取るので、コンストラクタコードのウィンドウにコントロールを追加するべきでしょうか?あるいは、ウィンドウに追加されたときにparentwindow propを設定することもできます。 – thetiniestmouse

+0

コントロールの親ウィンドウをウィンドウに追加すると、それが最も意味があるように見えますが、親ウィンドウのセッターをパブリックにすることはできません。この場合、ウィンドウに追加するときだけ設定する必要があるからです。私はちょうどそれを愚かな証拠にすることはおそらく愚か者の使命であると思うが、それでも解決しなければならないかもしれない。 – thetiniestmouse

答えて

0

あなたがAddControlメソッドをコード化された方法は:

public void AddControl <T>(object[] constructorArgs) 
     where T : class, IControl 
    { 
    } 

あなただけのタイプとconstructorArgsを使用してそのインスタンスを作成します。あなたのAddControl方法を提供することを開発者が意図しています。このメソッド自体は、暗黙のうちにリフレクションを使用するように強制します。それ以外はチャンスがありません。タイプTのコントロールを追加するには、タイプTのコントロールのインスタンスを作成する必要があります。あなたのWindowクラスはT reflectionに関する手がかりを持っていないので、唯一の解決策です。 他のアプローチを容易にするために、AddControlのオーバーロードを考慮する必要があります。抽象メソッドを作成

public virtual T AddControl <T>() 
     where T : class, new(),IControl 
    { 
     //now you can create instance no reflection required 
     var control = new T(); 
     this.Controls.Add(control); 
     return control; 
    } 

    public void AddControl <T>(T control) 
     where T : class, IControl 
    { 
    } 

    public abstract void AddControl <T>(object[] constructorArgs) 
     where T : class, IControl; 

は、子クラスの実装の責任とTの仮定種類が知られているかで、少なくともTがあるかもしれないものの既知のタイプのすべてのケースされて処理することができるTの新しいインスタンスを作成を渡します処理された。 それは広い範囲の話題です。私は主観的にもそう思います。 OOPの最良の使い方は、あなたの論理的目的に合ったデザインを実現することです。

関連する問題