2015-04-02 102 views
2

我有以下类别:在C#override关键字

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(); 
     } 
    } 
} 

在这里,我还没有在派生类Manager使用任何override关键字的方法Show()但代码运行正常。那么override关键字的实际用途是什么。

+0

尝试员工的人=新的经理();和经理man =新经理();有和没有覆盖,而不是var man = new Manager();看看你是否还有问题。 – 2015-04-02 06:46:43

+0

这里的关键是如何在* compile-time *中定义的变量。当它已被引用为'Manager'(在你的情况下使用'var')时,编译器知道调用'Manager.Show'。当你引用'man'作为基类型('Employee')时,* Polymorphism *开始起作用,现在'virtual'关键字告诉编译器在* runtime *中检查可能的重写方法(通常使用vTable http:///en.wikipedia.org/wiki/Virtual_method_table)。 – haim770 2015-04-02 06:53:16

回答

10

你不是重写原来的方法,你是hiding它。这也是可能的,但也许不是你想要的或者你期望的,因为你输了polymorphism。我举一个例子:

static void Main(string[] args) 
{ 
    var man=new Manager(); 
    man.Show(); 
    Console.ReadKey(); 
} 

这是你的代码,并输出“从孩子”。以下使用“覆盖”时也会输出“From child”。在你的情况下它不会。

static void Main(string[] args) 
{ 
    var man=new Manager(); 
    (man as Employee).Show(); 
    Console.ReadKey(); 
} 

类似的问题在这里问:virtual keyword in c#。虽然它不涉及override关键字,但问题类别大致相同。


多态性何时有用的现实例子。我必须编写一个应用程序,根据他们的角色计算公司员工的全部奖金。正如你所做的那样,我有一个带有public virtual double CalculateBonus();方法的员工课程,并且有几个课程来源于此。

感谢多态,我不得不做的是遍历所有员工的List<Employee>,不管他们的角色,并调用CalculateBonus方法,如多态确信,总是覆盖被称为。

没有覆盖,奖金将全部为0,因为这是类别EmployeeCalculateBonus的默认结果。

+0

@ haim770 - 他在技术上使用[hiding](https://msdn.microsoft.com/en-us/library/aa691135%28v=vs.71%29.aspx)。 – 2015-04-02 06:47:55

+0

如果只有downvoter也评论... – 2015-04-02 06:53:34

+0

Pssh实施/亚型覆盖。接口(和显式实现)永远! – user2864740 2015-04-02 07:06:05

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"); 
     } 
    } 

Overriding vs method hiding

+0

未显示应用了“虚拟”方法或“覆盖”。确保链接回原来的问题/代码。 – user2864740 2015-04-02 06:50:06

+0

@ user2864740更新了答案 – Artiom 2015-04-02 06:51:02

+0

那么,如果/当使用'override'时会发生什么? – user2864740 2015-04-02 06:51:21