我有以下课程:
namespace ConsoleApplication8
{
public abstract class Employee
{
public virtual void Show()
{
Console.WriteLine("from base.");
}
}
public class Manager:Employee
{
public void Show()
{
Console.WriteLine("from child.");
}
}
class Program
{
static void Main(string[] args)
{
var man=new Manager();
man.Show();
Console.ReadKey();
}
}
}
此处我没有在派生类override
中使用任何Show()
关键字作为方法Manager
,但代码运行正常。那么override
关键字的实际用途是什么?
答案 0 :(得分:11)
您没有覆盖原始方法,而是hiding它。这也是可能的,但也许不是你想要的或你期望的,因为你失去了polymorphism。我举一个例子:
static void Main(string[] args)
{
var man=new Manager();
man.Show();
Console.ReadKey();
}
这是你的代码和输出"来自孩子"。以下,当使用"覆盖"也会输出"来自孩子"。在你的情况下,它不会。
static void Main(string[] args)
{
var man=new Manager();
(man as Employee).Show();
Console.ReadKey();
}
此处提出了类似的问题:virtual keyword in c#。虽然它没有解决override
关键字,但问题类大致相同。
多态性有用的现实例子。我必须根据他们的角色编写一个应用程序来计算公司中所有员工的奖金。正如您所做的那样,我有一个员工类,其中public virtual double CalculateBonus();
方法,并且有几个类别。
感谢Polymorphism,我所要做的就是迭代所有员工的List<Employee>
,无论他们的角色如何,并调用CalculateBonus
方法,因为多态性确保始终调用覆盖。
如果没有覆盖,奖金都会为0,因为这是CalculateBonus
课程中Employee
的默认结果。
答案 1 :(得分:2)
https://msdn.microsoft.com/en-us/library/ebca9ah3.aspx https://msdn.microsoft.com/en-us/library/ms173153.aspx
您将隐藏底层方法,因此您可能会收到编译器警告并使用&#34; new&#34;结合关键字来隐藏底层成员。覆盖很简单 - 你&#34;覆盖&#34;您自己实现的底层实现细节
答案 2 :(得分:0)
检查差异
void Main()
{
Person instance1=new SpecificPerson();
instance1.Execute();//Person
SpecificPerson instance2=new SpecificPerson();
instance2.Execute();//Specific
}
public class Person
{
public virtual void Execute()
{
Console.WriteLine("Person");
}
}
public class SpecificPerson:Person
{
public void Execute()
{
Console.WriteLine("Specific");
}
}