2015-04-02 101 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