2011-11-11 22 views
2

,它在C#可以做這樣的事情C#重寫抽象方法(包括輸入參數)

public absctract class ImportBase() 
{ 
    public abstract void CreateDocument(); 
} 
public class UsingOne : ImportBase 
{ 
    public override bool CreateDocument(string name) 
    { 
     return null; 
    } 
} 

我想有一些基類,其中只有一些方法,但在派生類中,我需要改變輸入的參數和方法內部。

回答

2

也許要儘量減少對你的派生類重複的代碼。基本上不可能有一個不同的簽名的覆蓋,但肯定你可以重構你的代碼,你可以在基類中保留可能的重複代碼並在你的派生類中使用它。

public absctract class ImportBase() 
{ 
    //Making this protected here 
    protected virtual void CreateDocument() 
    { 
     //Your CreateDocument code 
    }; 
} 

public class UsingOne : ImportBase 
{ 
    private override void CreateDocument() 
    { 
     // Override this if you have different CreateDocument for your different 
     // for different derived class. 
    } 
    public bool CreateDocument(string name) 
    { 
     // Do whatever you need to do with name parameter. 
     base.CreateDocument(); 
     // Do whatever you need to do with name parameter. 
     return true; // return false; 
    } 
} 

您可以創建UsingOne實例並調用CreateDocument(string name)

+0

這是很有用的謝謝你,我嘗試它。 –

+1

覆蓋將不得不被保護而不是私人。 –

4

你不重寫方法。有一個抽象(或虛擬的)方法的要點是,鑑於任何ImportBase,我應該能夠調用

importBase.CreateDocument(); 

這顯然不是用的情況下UsingOne,因爲它需要更多的信息。所以,你真的想你的來電者綁UsingOne,不只是ImportBase - 此時你已經失去了多態性的好處。

要覆蓋的方法,將實現必須具有相同的簽名,基本上是這樣。

+0

我明白了。找到方法只有方法的處方,並派生類說什麼方法需要什麼和返回 –