C# 将派生类型强制转换为基类型-不使用基方法实现
有人能解释一下为什么当我将派生类型转换为它的基类型时,没有使用虚拟方法的基类型实现C# 将派生类型强制转换为基类型-不使用基方法实现,c#,casting,C#,Casting,有人能解释一下为什么当我将派生类型转换为它的基类型时,没有使用虚拟方法的基类型实现 public class Employee { public virtual void Introduce() { Console.WriteLine("Hello, i'm an employee"); } } public class Manager : Employee { public override void Introduce() {
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
看到它们,但管理者的行为仍然像管理者一样。这正是你所期望的:你希望管理者自我介绍为管理者,员工自我介绍为员工
此行为称为。是;这正是
virtual
的意思。这就是多态性的本质。要获得您期望的功能,不要在基类中使方法virtual
,然后通过将其标记为new
而不是override
来隐藏派生类中的方法。虽然这通常不是你想要的行为。谢谢你的回答。我只是有点难以理解,将派生类型转换到它的基并不会改变它的类型。因此,当我将manager对象强制转换为Employee并使用“GetType()”时,它仍然是manager。变量的类型为Employee
,但它指向manager
的一个实例,由于继承的原因,该实例恰好也是Employee
(这就是赋值有效的原因)。