Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将派生类型强制转换为基类型-不使用基方法实现_C#_Casting - Fatal编程技术网

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
(这就是赋值有效的原因)。