Нарушает ли C-re-abstracting принцип открытого / закрытого?

Как программист на Java (начинающий), представляющий себя на C#, я обнаружил, что вы можете переформулировать уже реализованный метод, подобный этому (код из этого ответа)

public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Я знаю, что это не делает исходную реализацию в классе D полностью недоступной, а только недоступной для подклассов D, которые подклассируют ее через подкласс E (класс, который повторно абстрагирует метод), и поэтому не должны вызывать какой-либо фактической проблемы, если класс D был в производстве.

Тем не менее, я задаюсь вопросом, не является ли это изменением контракта класса D, который НЕ определяет подклассы, ДОЛЖНЫ переопределять DoWork(int i)? Разве это не противоречит принципу открытого / закрытого?

Обратите внимание, что у меня не было никакого действительного или даже теоретического кода, нарушенного этим, и имейте в виду, что я только начинаю с C#, поэтому я мог бы что-то здесь упустить.

1 ответ

Решение

Практика кода остается в значительной степени постоянной в разных языках программирования, таких как C# и Java.

Я не вижу никаких проблем с этим, если вы все еще используете хороший объектно-ориентированный дизайн. Просто убедитесь, что вы случайно не испортили оригинальную функциональность в первом конкретном классе (D в этом случае). Это единственная проблема, за которой я бы следил.

Что касается вашего перехода на C#, я думаю, вы быстро влюбитесь в.NET и удивитесь, как вы обходились без него!

Желаем удачи с новым языком. Надеюсь, это помогло:)

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