为什么要引用Derived Class创建一个Base Class对象

use*_*590 8 c# inheritance

我正在练习继承,在C#中使用测试程序,我发现以下语句不会引发错误:

BaseClass baseObj = new DerivedClass();
Run Code Online (Sandbox Code Playgroud)

为什么允许这种说法,是否存在这种说法对程序员有用的情况?

这是我的测试程序:

class BaseClass
{
    public void show()
    {
        Console.WriteLine("Base Class!");

    }
}

class DerivedClass : BaseClass
{
    public void Display()
    {
        Console.WriteLine("Derived Class!");            
    }
}

class Result
{
    public static void Main()
    {            
        BaseClass baseObj = new DerivedClass();
        baseObj.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

far*_*ran 14

我建议您更详细地阅读有关继承和多态性的内容.(这里和这里)

在这个答案中,我试图保持简单的概念.

为什么允许这种说法,是否存在这种说法对程序员有用的情况?

但是为了解释一下你的问题,我们来看一下需要使用多态的面向对象程序的简单而经典的例子.

假设您正在编写需要存储某些形状并在屏幕上显示的程序.为此,您需要将所有形状存储在数组中.对?

假设我们的类是这样的:

class BaseShape
{
    public virtual void Display()
    {
        Console.WriteLine("Displaying Base Class!");

    }
}

class Circle : BaseShape
{
    public override void Display()
    {
        Console.WriteLine("Displaying Circle Class!");            
    }
}

class Rectangle : BaseShape
{
    public override void Display()
    {
        Console.WriteLine("Displaying Rectangle Class!");            
    }
}
Run Code Online (Sandbox Code Playgroud)

你的数组可以是object数组.像这样:

object[] shapes = new object[10];
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中,您需要编写一种方法来显示形状.

一种解决方案可以迭代所有形状,并调用精确类型的形状的正确方法.像这样:

public static void DisplayShapes_BAD(){

    foreach(var item in Shapes)
    {
        if(typeof(Circle) == item.GetType())
        {
            ((Circle)item).Display();
        }
        if(typeof(Rectangle) == item.GetType())
        {
            ((Rectangle)item).Display();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当Shape应用程序中出现另一种类型时会发生什么?基本上你需要修改DisplayShapes_BAD()方法来支持新类型Shape(向方法体添加新的if语句)

这样就可以打破面向对象编程的开放/封闭原则.而且你的代码不太可维护.

存储形状以避免这种不良方法的更好方法是使用数组BaseShape.像这样:

public static List<BaseShape> Shapes = new List<BaseShape>();
Run Code Online (Sandbox Code Playgroud)

以下是如何将项添加到此形状列表中:

Shapes.Add(new Circle());
Shapes.Add(new Rectangle());
Run Code Online (Sandbox Code Playgroud)

现在来看看DisplayShapes方法的良好实现.

public static void DisplayShapes_GOOD()
{
    foreach(var item in Shapes)
    {
        item.Display();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,我们Display在类型为item的项目上调用方法BaseShape.但是C#如何知道调用正确的方法(例如圆形显示或矩形显示).这种机制是多态性.

完整代码作为Gist共享.

  • 谢谢。我现在认为我已经了解了该应用程序 (2认同)