我建议您更详细地了解继承和多态性(这里 和 这里)。
在本答案中,我试图将概念保持足够简单。
为什么允许这个语句?程序员有什么场景可以使用这个语句吗?
但是,为了解释您的问题,让我们看一个需要使用多态性的面向对象编程的简单而经典的例子。
假设您正在编写一个需要存储某些形状并在屏幕上显示它们的程序。为此,您需要将所有形状存储在数组中,对吧?
假设我们的类大致如下:
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!");
}
}
你的数组可以是一个对象
数组。就像这样:
object[] shapes = new object[10]
在您的应用程序中,您需要编写一种方法来显示形状。
一种解决方案是迭代所有形状并调用恰好该形状类型的正确方法。就像这样:
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();
}
}
}
但是当应用程序中出现另一种类型的Shape
时会发生什么?基本上,您需要修改DisplayShapes_BAD()
方法以支持新类型的Shape
(在方法主体中添加新的if语句)。
这样做会违反面向对象编程的开放/封闭原则,而且代码维护性不高。
更好的存储形状以避免这种糟糕的方法是使用BaseShape
数组。如下所示:
public static List<BaseShape> Shapes = new List<BaseShape>()
以下是将项目添加到这个形状列表的方法:
Shapes.Add(new Circle());
Shapes.Add(new Rectangle());
现在让我们看一下DisplayShapes方法的良好实现。
public static void DisplayShapes_GOOD()
{
foreach(var item in Shapes)
{
item.Display();
}
}
在上面的方法中,我们使用BaseShape
类型的项目调用Display
方法。 但是C#如何知道调用正确的方法(例如圆形显示或矩形显示)。这个机制就是多态。
完整代码已分享在Gist中。