2011-09-21 73 views
1

我檢出了MSDN和其他一些網站,但我仍然不確定我是否有答案。如果你有一個帶有虛擬函數Init()的父類,那麼我可以 - 在派生類中 - 有一個覆蓋函數Init(int num),或者你只需​​要爲每個派生類創建一個新函數?如果我沒有錯,後者會導致你在Child類中有2個Init函數,對吧?這裏有幾分我的意思:在C#中創建派生類時,是否可以使用n參數函數覆蓋0參數虛函數?

public class Parent { 
     protected int a; 

     public Parent() { 
      a=1; 
     } 

     public virtual void Init() { 
     } 
    } 

    public class Child : Parent { 

     public Child() { 
     } 

     //is this allowed? 
     public override void Init(int multiplier) { 
     } 

     //or do i have to do this and have 2 Init functions? 
     public void Init(int multiplier) { 
     } 
    } 

回答

5

你沒有真正覆蓋方法,你只是定義一個新的過載。

爲了能夠覆蓋的方法,基方法必須被宣佈爲public(或protectedvirtual(或abstract)方法和派生類必須使用完全相同的簽名。

在你的情況下,基類中不存在可覆蓋的方法,因此它是不允許的。它將允許如果Init(int)簽名存在可覆蓋的方法,但沒有,編譯器會在這裏產生錯誤。

+0

其實,這是我想通。猜猜這意味着我將把它留給派生類來擁有自己的Init函數。謝謝。 – Shawn

0

這是不可能的。
如果從基類調用該參數,該參數會是什麼?

0

重寫需要具有相同的簽名,否則沒有意義使其變爲虛擬。

0
//is this allowed? 
    public override void Init(int multiplier) { 
    } 

這不是重寫。

既然您正在引入新的乘數,它將被視爲新方法。

但是,如果你這樣做。

 public override void Init(){} 

它將被覆蓋。

但是,如果你在派生類中這樣做,它將被認爲是過載。

 public void Init(int Multiplier) 
     {} 
相關問題