是否可以将对象“转换”为更专业的对象?

时间:2009-05-27 14:34:38

标签: c# .net inheritance

问题是我需要一个额外的功能来处理我无法改变的类的对象(我正在尝试添加数据绑定支持)。 我能想到的最佳解决方案是使用此功能编写派生类。所以我可以使用这个类instate的对象。所以现在的问题是,如何初始化新类的对象?我可以使用原始对象作为参数创建一个构造函数,并使用此对象的值初始化派生对象,但对我来说,这似乎不是最聪明的解决方案。 如果我可以做类似的事情会很好:

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

原因这不起作用,因为ObjectOfAnUnchangeableClass不知道MyDerivedClass。另一个想法是拥有一个可以用对象“初始化”的构造函数。类似的东西:

public MyDerivedClass(UnchangeableClass obj): base(obj){}

这里的想法是,不要让基础构造函数构建一个新对象;它可以只取现有的对象。

所以我有两个问题:

  1. .net中是否有一些概念支持上面提到的内容?
  2. 在一个无法更改的类中有一些额外功能的最佳解决方案是什么?

6 个答案:

答案 0 :(得分:6)

您自己刚刚回答了这个问题 - 执行此操作的“标准”方法是在派生类的构造函数中获取基类的实例。这是decorator pattern

的一个例子

来自维基百科页面

  

在面向对象的编程中,   装饰图案是一种设计模式   允许新的/额外的行为   要添加到现有类   动态。

答案 1 :(得分:3)

我认为Duck Typing可能对您有所帮助。这基本上允许您在与继承无关的类之间“强制转换”,但它们与字段的外观相关。看起来他们现在使用动态代理类来进行类型之间的转换。我不确定这是如何在幕后工作,但我会发现。

语法将是这样的

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

基本上,它会将 ObjectOfAnUnchangeableClass 中的所有字段复制到具有相同名称的 MyDerivedClass 。您可以使用所描述的方法归档相同的行为,但如果您不喜欢这样,请给this library一个。

答案 2 :(得分:3)

一些可能的替代方案:

  • 创建一个包装类,而不是派生自ObjectOfAnUnchangeableClass,这可能不是从
  • 派生的
  • Extension methods

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)

  1. 类型转换器也许?
  2. 你可以制作一个扩展方法 - UnchangeableClass.ToMyDerivedClass();