Нарушает ли 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 и удивитесь, как вы обходились без него!
Желаем удачи с новым языком. Надеюсь, это помогло:)