Наследование одного перегруженного метода

Я довольно новичок в C# и ООП, и у меня есть вопрос относительно наследования.

Скажи, что у меня есть:

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(),

Мой вопрос, поэтому, есть ли код, который мне нужно реализовать, чтобы избежать этих ошибок? Разрешены ли пустые методы?

1 ответ

Вы злоупотребляете использованием 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,

Если команды ведут себя по-разному, вероятно, они не должны наследовать один и тот же абстрактный класс.

Другие вопросы по тегам