2012-02-27 72 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 
     }; 
    } 

显然我不能只设置“基= C-C”。无论如何要实现这一目标?

+0

看看AutoMapper – 2012-02-27 17:11:17

+0

也许你可以修改绑定,以便它可以与不继承'ConcreteClass'的包装器一起使用,而是包含它。绑定是怎么样的? – svick 2012-02-27 17:12:44

+0

绑定是WPF,所以我只想设置datacontext到基类,如果属性是有拿起它们,否则有空白 – 2012-02-27 17:31:29

回答

0

可以修改ConcreteClass以便它有一个额外的构造函数:是这样

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

定义它包含所有成员中的所有声明

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

你可以想象包装类基类,因为它继承了它们。

您可以创建这样一个新的实例(假设你有一个默认的构造函数)

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属性,我不想在新类中反映它们全部 – 2012-02-27 17:28:09

+0

在我实现“真正的”包装器时,您可以自由地只公开您想要的属性。 – 2012-02-27 17:30:38