用 C# 编写 Upcasting 和 Downcasting 表达式

Far*_*an 2 c# downcast upcasting

我最近一直在研究 c# 中的向上转换和向下转换。我知道向上转换是指从派生类到基类的转换。但是,当我看到向上转换的实际示例(如下所示)时,我感到困惑。

public class Shape 
{
...
}

public class Circle : Shape
{
...
}

Circle circle = new Circle();
Shape shape = new Shape();
// Converting an object into its base class reference
shape = circle
Run Code Online (Sandbox Code Playgroud)

如果我们将 circle 转换为它的基类引用,它不应该像

circle = shape 
Run Code Online (Sandbox Code Playgroud)

对不起,如果这听起来太业余了。这是因为我一直看到以下格式的表达式:

int x = 3; // means assign 3 to variable x. 
Run Code Online (Sandbox Code Playgroud)

所以我很困惑为什么圆圈在右手边而不是在左手边。请指教。把我当作初学者。

Mat*_*son 5

旁白:这被称为向上转换,因为传统上,类图是这样绘制的,基类物理地显示在派生类之上。)

现在当你这样做时:

shape = circle; // shape->(instance of Circle)
Run Code Online (Sandbox Code Playgroud)

您正在为Circle引用分配Shape引用,以便在分配之后引用shape将引用Circle.

这很好,因为你可以用 a 做的所有事情也可以ShapeCircle.

但是,如果您这样做:

circle = shape; // circle->(instance of Shape)
Run Code Online (Sandbox Code Playgroud)

您正在为Shape参考分配Circle参考。你不能这样做,因为(如果这是可能的),那么你就能够访问Circle不存在的功能Shape

例如,假设Circle.Radius存在但Shape.Radius不存在。

如果您被允许将circle引用指向aShape如果您尝试访问会发生什么circle.Radius?答案是:会发生未定义的行为,因为Shape.Radius不存在。