2009-05-27 20 views
0

問題は、私が変更できないクラスのオブジェクトに少し余分な機能が必要なことです(私はデータバインディングサポートを追加しようとしています)。 私が考えることができる最高のソリューションは、この機能を持つ派生クラスを書くことです。だから私はこのクラスのオブジェクトを使うことができます。ですから、今問題は新しいクラスのオブジェクトをどのように初期化するのですか?元のオブジェクトをパラメータとしてコンストラクタを作成し、このオブジェクトの値で派生オブジェクトを初期化することもできますが、これは賢明な解決策ではないようです。 ObjectOfAnUnchangeableClassがMyDerivedClassを知らないので、これは動作しません。原因オブジェクトをより特殊なオブジェクトに「キャスト」することは可能ですか?

// MyDerivedClass is derived from ObjectOfAnUnchangeableClass. 
MyDerivedClass Obj = ObjectOfAnUnchangeableClass as MyDerivedClass; 

:私のような何かを行うことができれば それはいいだろう。別の考え方は、オブジェクトで「初期化」できるコンストラクタを持つことです。次のようなものがあります:

ここでは、ベースコンストラクタに新しいオブジェクトを作成させるのではなく、それは単に既存のオブジェクトを取ることができます。

だから私は二つの質問があります。

  1. は、上記のようなサポート何か.NETでいくつかの概念がありますか?
  2. 変更できないクラスに特別な機能を追加するにはどうすればよいでしょうか?

答えて

6

これはあなた自身の答えです。これを行うための「標準的な」方法は、派生クラスのコンストラクタで基本クラスのインスタンスを取得することです。これは、ウィキペディアのページでオブジェクト指向プログラミングで

からdecorator pattern

の例です、 Decoratorパターンは、新たな/追加の行動 は、既存のクラス に追加することを可能にするデザインパターン です動的に

+0

だから私はこの道を取ると思います。これは:http://stackoverflow.com/questions/124336/a-way-of-casting-a-base-type-to-a-derived-type私にも最初の質問に答えました。 – uli78

3

私はDuck Typingがあなたを助ける可能性があると考えています。これは基本的に、継承に関係しないクラス間でキャストできますが、フィールドの見た目には関連しています。彼らは現在、動的なプロキシクラスを使用して型間の変換を行うように見えます。私はカバーの下でどのように動作するのか正確にはわかりませんが、私は見つけ出すつもりです。

構文は基本的に、それは同じ名前を持つObjectOfAnUnchangeableClassへMyDerivedClassからすべてのフィールドをコピーします。この

MyDerivedClass Obj = 
    DuckTyping.Cast<MyDerivedClass>(ObjectOfAnUnchangeableClass); 

ようなものになるだろう。説明した方法で同じ動作をアーカイブできますが、それが気に入らない場合は、this libraryを実行してください。

0

派生クラスのコンストラクタを呼び出し、元のクラスを引数として渡すのはかなり簡単です。元のクラスにすでにコピーコンストラクタがある場合は、プロパティを自分でコピーする必要はありません。

第2の質問、機能を追加する方法:これは、追加する必要がある機能の種類によって異なります。継承の他にも、拡張方法や特別な状況のためのかなりのデザインパターンがあります。

0
  1. おそらくタイプコンバータ?
  2. 拡張メソッド - UnchangeableClass.ToMyDerivedClass()を作成できます。
2

ここで第三の選択肢である - UnchangeableClassを拡張していますが使用して、この新しいタイプのいずれかの新しいメソッドを公開することができ、それのインスタンスが含まれていない新しいタイプの作成:

class MyDerivedClass 
{ 
    UnchangeableClass unchangeableClass; 

    public MyDerivedClass(UnchangeableClass obj) 
    { 
     this.unchangeableClass = obj; 
    } 

    // other methods to support whatever you need 
} 

を私はこれは派生型を作成するより簡単でクリーンだと考えています。

+0

私は同意します。これがOPの状況にとって最善の解決策になるかどうかは分かりませんが、可能な場合は委任を優先する方がよいでしょう。 – ebrown

3

いくつかの可能な選択肢:

  • は、ObjectOfAnUnchangeableClassから派生せずに、ラッパークラスを作成します
  • Extension methods

PS由来することを意図していない可能性があります:データバインディングと拡張についてメソッド、あなたはこの投稿を見たことがありますか?
How to call extension methods using Eval in a databound control

+0

データバインディングをサポートするプロパティも必要なので、拡張メソッドは機能しません。 – uli78

関連する問題