C# 存储子类的超类

C# 存储子类的超类,c#,inheritance,C#,Inheritance,我知道超类可以存储子类的实例 例如: public class Subclass { private int color; public Subclass() { color = "red"; } } Superclass v = new Subclass(); 超类不知道子类中的方法、变量等, 然而,铸造它,让你获得这些 这是怎么回事 例如: Vechicle v = new Car(); Car c = (Car) v; Consoel.WriteLi

我知道超类可以存储子类的实例

例如:

public class Subclass
{
   private int color;

   public Subclass()
   {
     color = "red";
   }
}

Superclass v = new Subclass();
超类不知道子类中的方法、变量等, 然而,铸造它,让你获得这些

这是怎么回事

例如:

Vechicle v = new Car();
Car c = (Car) v;
Consoel.WriteLine(c.color);


Output:
red

这并不像你说的那么简单

如果在
汽车的构造中更改颜色,则颜色将不同于红色

此外,还有一个概念

以下不是继承,而是铸造

所有继承的类型都可以类型转换为基类型,但这不是必需的。 此外,还可以进行用户定义的转换,以及使用helper类进行的转换。

每个对象实例都有一个具体的类型。其他所有内容都是应用于此类型的(兼容)“视图”,对
Car
的转换不会爆炸-它始终是一辆车!现在,由于非虚拟方法和非虚拟运算符的存在,这些视图可能会造成一些破坏(读:多态性的作用不符合预期)。。但这是一个完整的讨论本身@用户2864740,您的术语对于一个C#程序员来说是非常特殊的。(“查看”?“分解”?)非虚拟方法和“非虚拟运算符”(!?)有什么关系?@LaggKing,请只发布您编译的代码。“子类m”是非常非法的。@KirkWoll非虚拟方法根据“视图”(或“接收者”表达式的类型)(或调用成员的表达式(或点左侧的表达式))更改虚拟方法的MRO)。我曾指出,运营商是非虚拟的,因此也会遭受同样的命运。“Explode”是一种口语,具体指的是一个InvalidCastException(或非编译程序)。
Car c = (Car) v;