问题是我需要一个额外的功能来处理我无法改变的类的对象(我正在尝试添加数据绑定支持)。 我能想到的最佳解决方案是使用此功能编写派生类。所以我可以使用这个类instate的对象。所以现在的问题是,如何初始化新类的对象?我可以使用原始对象作为参数创建一个构造函数,并使用此对象的值初始化派生对象,但对我来说,这似乎不是最聪明的解决方案。 如果我可以做类似的事情会很好:
// MyDerivedClass is derived from ObjectOfAnUnchangeableClass.
MyDerivedClass Obj = ObjectOfAnUnchangeableClass as MyDerivedClass;
原因这不起作用,因为ObjectOfAnUnchangeableClass不知道MyDerivedClass。另一个想法是拥有一个可以用对象“初始化”的构造函数。类似的东西:
public MyDerivedClass(UnchangeableClass obj): base(obj){}
这里的想法是,不要让基础构造函数构建一个新对象;它可以只取现有的对象。
所以我有两个问题:
答案 0 :(得分:6)
您自己刚刚回答了这个问题 - 执行此操作的“标准”方法是在派生类的构造函数中获取基类的实例。这是decorator pattern
的一个例子来自维基百科页面
在面向对象的编程中, 装饰图案是一种设计模式 允许新的/额外的行为 要添加到现有类 动态。
答案 1 :(得分:3)
我认为Duck Typing可能对您有所帮助。这基本上允许您在与继承无关的类之间“强制转换”,但它们与字段的外观相关。看起来他们现在使用动态代理类来进行类型之间的转换。我不确定这是如何在幕后工作,但我会发现。
语法将是这样的
MyDerivedClass Obj =
DuckTyping.Cast<MyDerivedClass>(ObjectOfAnUnchangeableClass);
基本上,它会将 ObjectOfAnUnchangeableClass 中的所有字段复制到具有相同名称的 MyDerivedClass 。您可以使用所描述的方法归档相同的行为,但如果您不喜欢这样,请给this library一个。
答案 2 :(得分:3)
一些可能的替代方案:
ObjectOfAnUnchangeableClass
,这可能不是从P.S:关于数据绑定和扩展方法,您看过这篇文章了吗? How to call extension methods using Eval in a databound control
答案 3 :(得分:2)
这是第三个选项 - 创建一个不扩展UnchangeableClass
的新类型,但包含一个可以使用它的实例,然后从这个新类型中公开任何新方法:
class MyDerivedClass
{
UnchangeableClass unchangeableClass;
public MyDerivedClass(UnchangeableClass obj)
{
this.unchangeableClass = obj;
}
// other methods to support whatever you need
}
我相信这比创建派生类型更简单,更清晰。
答案 4 :(得分:0)
调用派生类的构造函数并将原始类作为参数传递非常简单。如果原始类已经有一个复制构造函数,则不需要自己复制属性。
第二个问题,如何添加功能:这取决于您需要添加哪种功能。除了继承之外,还有扩展方法,以及针对特殊情况的一些设计模式。
答案 5 :(得分:0)