4

我有一個覆蓋基類中的方法的子類。基類的方法有默認參數。我的子類需要在重寫的方法中顯示那些默認參數,儘管它們不需要被選擇。爲什麼我的子類需要用默認參數覆蓋?

public class BaseClass 
{ 
    protected virtual void MyMethod(int parameter = 1) 
    { 
     Console.WriteLine(parameter); 
    } 
} 

public class SubClass : BaseClass 
{ 
    //Compiler error on MyMethod, saying that no suitable method is found to override 
    protected override void MyMethod() 
    { 
     base.MyMethod(); 
    } 
} 

但是,如果我改變我的方法簽名

protected override void MyMethod(int parameter = 1) 

甚至

protected override void MyMethod(int parameter) 

那麼它是幸福的。我期望它接受一個無參數的方法簽名,然後在調用base.MyMethod()時允許它使用默認參數。

爲什麼子類的方法需要一個參數?

回答

8

我期望它接受一個無參數的方法簽名,然後讓它被允許在調用base.MyMethod()時使用默認參數。

您的預期不正確。爲參數添加默認值並不意味着沒有參數的方法存在。它只是將默認值注入到任何調用代碼中。所以沒有方法沒有參數可以覆蓋。

可以明確地建立在基類都重載:

protected virtual void MyMethod() 
{ 
    MyMethod(1); 
} 
protected virtual void MyMethod(int parameter) 
{ 
    Console.WriteLine(parameter); 
} 

然後,你可以覆蓋或者過載,但如果這是合適的,目前還不清楚從你的問題。

相關問題