【问题标题】:Is it possible to "cast" an object to a more specialized object?是否可以将对象“转换”为更专业的对象?
【发布时间】:2010-10-29 07:11:03
【问题描述】:

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

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

当然这不会起作用,因为 ObjectOfAnUnchangeableClass 不知道 MyDerivedClass。另一个想法是有一个可以用对象“初始化”的构造函数。比如:

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

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

所以我有两个问题:

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

【问题讨论】:

    标签: c# .net inheritance


    【解决方案1】:

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

    语法是这样的

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

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

    【讨论】:

      【解决方案2】:

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

      来自维基百科页面

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

      【讨论】:

      【解决方案3】:

      调用派生类的构造函数并将原始类作为参数传递非常简单。如果原类已经有了拷贝构造函数,就不需要自己拷贝属性了。

      第二个问题,如何添加功能:这取决于你需要添加什么样的功能。除了继承,还有扩展方法,还有不少针对特殊情况的设计模式。

      【讨论】:

        【解决方案4】:
        1. 也许是类型转换器?
        2. 您可以创建一个扩展方法 - UnchangeableClass.ToMyDerivedClass();

        【讨论】:

          【解决方案5】:

          这是第三种选择 - 创建一个不扩展 UnchangeableClass 的新类型,但包含一个您可以使用的实例,然后公开该新类型的任何新方法:

          class MyDerivedClass
          {
              UnchangeableClass unchangeableClass;
          
              public MyDerivedClass(UnchangeableClass obj)
              {
                  this.unchangeableClass = obj;
              }
          
              // other methods to support whatever you need
          }
          

          我相信这比创建派生类型更简单、更清晰。

          【讨论】:

          • 我同意。我不知道这是否是 OP 情况的最佳解决方案,但最好尽可能选择委托。
          【解决方案6】:

          一些可能的替代方案:

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

          P.S:关于数据绑定和扩展方法,你看过这篇文章吗?
          How to call extension methods using Eval in a databound control

          【讨论】:

          • 我认为扩展方法行不通,因为我还需要支持数据绑定的属性。
          猜你喜欢
          • 1970-01-01
          • 2011-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多