我正在练习继承,在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共享.