c# - 子对象的向上转换和实例化之间的区别

标签 c#

我的老师要求我创建一个关于形状继承层次结构的项目,并在 Main() 中他要求我们创建一个形状数组,用于存储每个类点、圆和圆柱的一个实例。

所以Main()的代码在这里......

class Program
{
    static void Main(string[] args)
    {
        Shape[] areaOfShapes = new Shape[3];

        areaOfShapes[0] = new Point(10, 5);
        areaOfShapes[1] = new Circle(20);
        areaOfShapes[2] = new Cylinder(25,12);

        foreach(Shape item in areaOfShapes)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

我只是想知道这算不算向上转型。子对象的向上转换和普通实例化有什么区别?

最佳答案

好吧,您在 Main 方法中使用的东西在面向对象的世界中称为多态性。

什么是多态性?

答案:根据 MSDN

Polymorphism is often referred to as the third pillar of object-oriented programming, after encapsulation and inheritance.

多态性是一个希腊词,意思是“多种形状”,它有两个不同的方面:

  1. 在运行时,派生类的对象可以在方法参数和集合或数组等位置被视为基类的对象。发生这种情况时,对象的声明类型不再与其运行时类型相同。

  2. 基类可以定义和实现虚拟方法,派生类可以重写它们,这意味着它们提供自己的定义和实现。在运行时,当客户端代码调用该方法时,CLR 会查找对象的运行时类型,并调用虚拟方法的重写。因此,在源代码中,您可以调用基类上的方法,并导致执行该方法的派生类版本。

因此,根据您的示例,您有一个父类,即 Shape。 Shape 类有三个实现:Point、Circle 和 Cylinder。

当你这么做的时候

Shape[] areaOfShapes = new Shape[3];

您在堆栈中创建了 3 个引用(areaOfShapes),它们将指向堆内存中的 Shape 对象或 Shape 对象的子类对象。

图片取自here .

所以基本上父引用可以指向堆中的子对象,但反之亦然是不可能的。

在正常实例化的情况下,您将引用堆栈中的任何类(比如说形状)和堆中同一类的对象。我的意思是您将在堆栈中引用areaOfShapes,并且该引用将指向堆中的Shape对象。

在这里阅读有关多态性的更多信息 - https://msdn.microsoft.com/en-us/library/ms173152.aspx

关于c# - 子对象的向上转换和实例化之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31803468/

相关文章:

c# - 检测两条路径是否相同

c# - 使用签名调用Api网关时出现错误消息

c# - OpenXML Power Tools 编译时出现问题 : 'OutputTypeAttribute' could not be found

c# - nUnit 中的 ExpectedException 给了我一个错误

c# - 当鼠标悬停在条形图上时,如何在 C# 中的图表上更改和显示工具提示?

c# - 如何从 List<struct> 项的组件创建 List<Guid> ?

c# - 如何在 ASCX 上设置控件的 Int 属性?

c# - 事件目录 LDAP 查询 - 想要过滤掉禁用的用户,但缺少属性

c# - 将整个对象转储到 C# 中的日志的最佳方法是什么?

c# - 我可以获得指向 Span 的指针吗?