2017-05-10 16 views
0

我對C#和OOP相當陌生,而且我有一個關於繼承的問題。繼承一個重載的方法

說我有:

public abstract class Command 
{ 
    protected Command() 
    { 
    } 

    public abstract string Execute(); 

    public abstract string Execute(object o); 
} 

public class CommandA : Command 
{ 
    public override string Execute() 
    { 
    } 
} 

public class CommandB : Command 
{ 
    public override string Execute(object o) 
    { 
    } 
} 

有因CommandA不執行Execute(object o)CommandB不執行Execute()明顯的錯誤。

我的問題是,是否有我需要執行的代碼來避免這些錯誤?是否允許空方法?

+0

基類(其他類繼承的類)應該只有定義其他類共享的方法。 – EpicKip

+0

也許'public abstract string Execute(object o = null);'? –

+0

不需要。您將不得不重寫抽象類的抽象方法。 爲了避免它不讓基類作爲抽象。 – Manoj

回答

2

如果您希望子類沒有實際實現某些方法,那麼您會濫用abstractabstract用於強制執行基類必須實現該功能。如果有人打電話給new CommandB().Execute()會發生什麼? 。

在某些情況下,一個設計可能是不正確的,你在你所處的情況下結束了在這些情況下,它的有些常見的(雖然在我看來,一個代碼味道),做到以下幾點:

public class CommandA : Command 
{ 
    public override string Execute() 
    { 
    } 

    public override string Execute(object o) 
    { 
     throw new NotImplementedException(); 
    } 
} 

一個有點清潔方法:

public abstract class Command 
{ 
    protected Command() 
    { 
    } 

    public abstract string Execute(object o = null); 
} 

雖然你仍然要必須處理的事實,有人可能會傳遞一個對象來CommandA

如果這些命令具有不同的行爲,那麼很可能它們不應該是同一個抽象類的子類。

+0

謝謝 - 我已經改變了代碼以重新定位繼承以進行正確的編碼實踐! –