C#为什么使用override和virtual

本文关键字:virtual override 为什么 | 更新日期: 2023-09-27 18:13:12

我用C++编程已经有一段时间了,现在我开始使用C#,但我不知道virtualoverride关键字。由于指针和所有与之相关的东西大多已经从C++中消失了,我们真的不需要它们,是吗?或者我错过了C#编程的一些要点。

示例:

namespace ConsoleApplication1
{
    public class Employee
    {
        public virtual void GetPayCheck()
        {
            Console.WriteLine("employee gets his pay check ");
        }
        public void Work()
        {
            Console.WriteLine("employee works ");
        }
    }
    public class Manager : Employee
    {
        public override void GetPayCheck()
        {
            Console.WriteLine("MANAGER gets his pay check ");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Employee emp = new Employee();
            Manager exec = new Manager();
            emp.Work();
            exec.Work();
            emp.GetPayCheck();
            exec.GetPayCheck();
        }
    }
}

即使我省略了virtual或override关键字(或两者(,我仍然会得到相同的输出。我是什么

C#为什么使用override和virtual

使用virtualoverride可以完全替换Work方法,无论变量声明为何种类型。如果方法声明为虚拟,CLR将检查对象是否为派生类以及该方法是否已被重写。如果一个方法不是虚拟的,CLR只从对象声明为.的类型中调用名称为Work的方法

    static void Main(string[] args)
    {
        Employee emp = new Employee();
        Manager exec = new Manager();
        DoWork(emp); // employee works and gets pay check
        DoWork(exec); // if virtual and override are used, MANAGER get pay check
                      // however, if you don't override the method, DoWork
                      // will treat the argument as an Employee.
    }
    static void DoWork(Employee emp)
    {
        emp.Work();
        emp.GetPayCheck();
    }

即使指针语法已经消失,您使用C++指针和引用变量学到的概念仍然存在。virtual在C#中和在C++中做同样的事情:它在一个子类中声明一个方法为可重写的。override替换方法是否是虚拟的,所以这就是代码以这种方式工作的原因。

尝试:

Employee manager = new Manager();
manager.GetPayCheck();

不管怎样,你仍然得到同样的结果吗?

答案:你没有。

如果使用virtualoverride,不管怎样,都会调用ManagerGetPayCheck()版本。如果同时省略virtualoverride,则如果实例转换为Employee,则会调用EmployeeGetPayCheck()版本;如果实例转换成Manager,则会呼叫Manager的版本。后一种情况被称为"隐藏",您将收到编译器警告,建议您使用new关键字来明确隐藏是故意的。