当你创建一个类型派生类的变量来存储基类对象的变量时,我有一个关于这个例子的实际用法的问题。
DerivedClass C = new BaseClass();
在什么情况下我可以使用它。
答案 0 :(得分:2)
在什么情况下我可以使用它。
你不能。如初。
静态类型的要点是,您可以依赖与您声明的类型兼容的变量的值。因此,如果您将变量声明为:
DerivedClass C;
然后C
的任何值都必须能够被视为DerivedClass
。特别是DerivedClass
的所有成员都必须可用。如果该值实际上是对BaseClass
的实例的引用,并不是所有这些成员,则根本不会出现这种情况。
幸运的是,语言规则(以及编译器)理解这将是一件非常糟糕的事情,因此您将收到编译时错误。
答案 1 :(得分:0)
如果您尝试将基类的实例强制转换为派生类的实例,则必须确保第一个实际上是使用if (obj is DerivedClass) newInstance = (DerivedClass) obj
的派生类型。
如果你需要一个upcast,你必须实现一种复制方法,使用反射将所有成员从你的基类复制到派生类。在这种情况下,您必须为不属于DerivedClass
的{{1}}的每个成员设置某种默认值。但这更像是一个黑客,可能带来一些危险,因为你可能会创建一些腐败的实例。