2012-02-27 8 views
1

私は抽象基本クラスから派生したいくつかのクラスを持っています。具象クラスは、基本クラスへの参照によってコンテナに格納されます。具体的なクラスには、FixedDocumentのページにバインドするために使用される多くのプロパティがあります。基本プロパティを上書きすることなく追加のプロパティを追加する

具体的なクラスを実行時に追加したい場合は、FixedDocumentページにもバインドされます。デコレータパターンを調べましたが、デコレータクラスのすべての具体的なクラスプロパティをオーバーライドして可視にする必要があるようです。

class BaseClass 
    { 
     public string Name { get; set; } 
    } 

    class ConcreteClass : BaseClass 
    { 
     public int MyProperty { get; set; } 
    } 

    class ConcreteClassWrapper : ConcreteClass 
    { 
     public int AdditionalProperty { get; set; } 

     public ConcreteClassWrapper(ConcreteClass cc) 
     { 
      base = cc; 
     } 
    } 

    private static void RunTime() 
    { 
     List<BaseClass> list = new List<BaseClass>(); 

     ConcreteClass cc = new ConcreteClass() 
     { 
      Name = "Original", 
      MyProperty = 5 
     }; 

     list.Add(cc); 

     cc = new ConcreteClassWrapper(cc) 
     { 
      AdditionalProperty = 10 
     }; 
    } 

明らかに私はちょうどセットカント「= CCベース」:次のようにベースのプロパティの値を継承する具象クラスから派生したラッパーを追加する方法はあります。これを達成するためにとにかくありますか?それは追加のコンストラクタを持つように

+0

AutoMapper –

+0

「ConcreteClass」を継承しないラッパーで動作するようにバインディングを変更することはできますが、代わりにそのバインディングを含めることができます。バインディングはどのように見えますか? – svick

+0

結合はので、私はただ、基本クラスへのDataContextを設定したいWPFであると性質があるされている場合は、それ以外の場合は空白の –

答えて

0

あなたがConcreteClassを変更することができます。

class ConcreteClass : BaseClass 
{ 
    public int MyProperty { get; set; } 

    public ConcreteClass(ConcreteClass copy) 
    { 
     this.MyProperty = copy.MyProperty; 
    } 
} 

class ConcreteClassWrapper : ConcreteClass 
{ 
    public int AdditionalProperty { get; set; } 

    public ConcreteClassWrapper(ConcreteClass cc) 
     base(cc) 
    { 

    } 
} 
0

をあなたはそれがすべてのメンバがすべての中で宣言が含まれ、この

class ConcreteClassWrapper : ConcreteClass 
{ 
    public string Name { get; set; } // Inherited from BaseClass 
    public int MyProperty { get; set; } // Inherited from ConcreteClass 
    public int AdditionalProperty { get; set; } 
} 

のように定義するラッパークラスを想像することができますそれを継承しているので、基本クラス。

あなたは(あなたがデフォルトのコンストラクタを持っていると仮定して)

var wrapper = new ConcreteClassWrapper { 
    Name = "xy", 
    MyProperty = 5, 
    AdditionalProperty = 7 
}; 

をこのような新しいインスタンスを作成することができますが、ラッパーが真のラッパーになりたい場合は、基本クラスから

を継承しません
class ConcreteClassWrapper 
{ 
    private ConcreteClass _cc; 

    public ConcreteClassWrapper(ConcreteClass cc) 
    { 
     _cc = cc; 
    } 

    public string Name { get { return _cc.Name; } set { _cc.Name = value; } } 
    public string MyProperty{ get { return _cc.MyProperty; } set { _cc.MyProperty = value; } } 
    public int AdditionalProperty { get; set; } 
} 
+0

おかげオリヴィエがあり、それらをピックアップし、私の実際のclassessを持っているので、私はこれを避けたかったです30-40プロパティと私はあなたが欲しいだけのプロパティを公開するのは自由です「真」ラッパーの私の実装では、新しいクラス –

+0

でそれらのすべてを反映していたくありませんでした。 –

関連する問題