C#为什么使用override和virtual
本文关键字:virtual override 为什么 | 更新日期: 2023-09-27 18:13:12
我用C++编程已经有一段时间了,现在我开始使用C#,但我不知道virtual
和override
关键字。由于指针和所有与之相关的东西大多已经从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关键字(或两者(,我仍然会得到相同的输出。我是什么
使用virtual
和override
可以完全替换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();
不管怎样,你仍然得到同样的结果吗?
答案:你没有。
如果使用virtual
和override
,不管怎样,都会调用Manager
的GetPayCheck()
版本。如果同时省略virtual
和override
,则如果实例转换为Employee
,则会调用Employee
的GetPayCheck()
版本;如果实例转换成Manager
,则会呼叫Manager
的版本。后一种情况被称为"隐藏",您将收到编译器警告,建议您使用new
关键字来明确隐藏是故意的。