6

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

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

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

DerivedClass dc = MethodThatReturnsBaseClassObject() as DerivedClass;
4

2 回答 2

9

发生这种情况是因为BaseClass不是DerivedClass(而是DerivedClass)的实例BaseClass,因此您不能将基类的实例强制转换为派生类的实例(嗯,您可以,但正如您所发现的那样,它将为 null)。

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

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

然后:

 DerivedClass dc = new DerivedClass(MethodThatReturnsBaseClassObject());
于 2013-11-05T23:15:56.170 回答
1

如果不看会发生什么,就很难说清楚MethodThatReturnsBaseClassObject();

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

如果MethodThatReturnsBaseClassObject()返回 dc 的实例BaseClass将始终为空。BaseClass在这种情况下将持有参考。

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

于 2013-11-05T23:09:40.323 回答