2017-05-10 10 views
0

私はC#とOOPにはかなり新しいので、継承に関する質問があります。1つのオーバーロードされたメソッドを継承します

は、私が持っていると言う:

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) 
    { 
    } 
} 

Execute()を実装していないExecute(object o)CommandBを実装していないCommandAによる明らかなエラーがあります。

私の質問は、これらのエラーを回避するために実装する必要があるコードがあるかどうかです。空のメソッドは許可されていますか?

+0

基本クラス(他のクラスが継承するクラス)は、他のクラスが共有するメソッドだけを定義する必要があります。 – EpicKip

+0

'public abstract string Execute(オブジェクトo = null);'? –

+0

いいえ。抽象クラスの抽象メソッドをオーバーライドする必要があります。 それを回避するには、抽象クラスとして基本クラスを作成しないでください。 – Manoj

答えて

2

サブクラスが実際にいくつかのメソッドを実装していないと思われる場合は、abstractの使用を悪用しています。 abstractは、基本クラスに機能を実装する必要があることを強制するために使用されます。誰かが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

ありがとうございます - 適切なコーディング慣行のために継承をリダイレクトするコードを変更しました! –

関連する問題