【问题标题】:Convert a base class to a derived class将基类转换为派生类
【发布时间】:2013-11-17 00:41:26
【问题描述】:

我想知道为什么这会适当地填充派生类:

BaseClass bc = MethodThatReturnsBaseClassObject();
DerivedClass dc = bc as DerivedClass;

但这会创建一个空的派生类对象:

DerivedClass dc = MethodThatReturnsBaseClassObject() as DerivedClass;

【问题讨论】:

  • 第一个会将dc 保留为空引用(不是对象;只是一个引用)。尝试展示一个简短但完整的程序来说明问题,我想你会发现两者是一致的。
  • 您必须做一些事情来转换课程。例如,覆盖 = 运算符或创建一个将基对象作为参数并将其转换为派生对象的构造函数。
  • 感谢您提供的所有信息。这是一天的结束,我想我的大脑没有工作。我现在看到它们是一样的。接受的答案最终是我想要完成的。

标签: c# asp.net inheritance type-conversion


【解决方案1】:

发生这种情况是因为BaseClass 不是DerivedClass 的实例(但DerivedClassBaseClass 的实例),因此您不能将基类的实例转换为派生类的实例(嗯,你可以,但你发现它会是空的)。

您可以通过将构造函数添加到以基类作为参数的派生类来实现(我认为)您想要实现的目标:

public DerivedClass(BaseClass baseClass) {
    // Populate common properties, call other derived class constructor, or call base constructor
}

然后:

 DerivedClass dc = new DerivedClass(MethodThatReturnsBaseClassObject());

【讨论】:

    【解决方案2】:

    如果不看到MethodThatReturnsBaseClassObject(); 的内容,很难判断。

    除了在第一种情况下临时分配给BaseClass之外,您的语句(如果MethodThatReturnsBaseClassObject();总是返回DerivedClass对象)之间绝对没有区别。

    如果MethodThatReturnsBaseClassObject() 返回BaseClass 的实例,dc 将始终为空。在这种情况下,BaseClass 将持有一个引用。

    如果MethodThatReturnsBaseClassObject() 返回DerivedClass 的实例,dc 将具有引用(并且不会为空)。

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 2021-02-18
      • 2017-07-18
      • 2011-02-04
      • 2012-09-15
      • 2011-06-30
      相关资源
      最近更新 更多