将派生类型强制转换为基类型-不使用基方法实现

本文关键字:类型 方法 实现 基类 派生 转换 | 更新日期: 2023-09-27 18:27:02

有人能解释一下为什么当我将派生类型转换为其基类型时,没有使用虚拟方法的基类型实现吗。

public class Employee
{
    public virtual void Introduce()
    {
        Console.WriteLine("Hello, i'm an employee");
    }
}
public class Manager : Employee
{
    public override void Introduce()
    {
        Console.WriteLine("Hello, i'm a manager");
    }
}
void Main()
{
    Manager manager = new Manager();
    Employee employee = (Employee)manager;
    employee.Introduce();   
}
// output is: Hello, i'm a manager

将派生类型强制转换为基类型-不使用基方法实现

这样看:您有一个员工列表(即基本类型)。您可以将基本类型或派生类型的对象(例如管理器)添加到此列表中。现在,你想循环浏览这个列表:

foreach (Employee emp in list)
{
    emp.Introduce();
}

循环变量将列表中的所有对象强制转换为Employee。在这里,投射不会改变对象的类型。它只会改变你看待它们的方式。也就是说,如果管理者有额外的属性和方法,你就不会通过emp看到它们,但管理者的行为仍然像管理者。这正是你所期望的:你希望经理自我介绍为经理,员工自我介绍为员工。

这种行为被称为多态性(C#编程指南)。