C#再抽象是否违反了open/closed原则?

Does C# re-abstracting violate the open/closed principle?

作为一名 Java 程序员(初学者)自我介绍 C#,我发现您可以像这样重新抽象已经实现的方法(来自 this answer 的代码)

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.
    }
}

我知道这不会使 class D 中的原始实现完全不可用,仅对 D 的 subclasses 不可用,subclass 通过 subclassing E(重新抽象该方法的 class),因此如果 class D 在生产中,则不会造成任何实际问题。

不过,我发现自己在想,这不是在修改 class D 的合同吗,它没有指定 subclasses 必须覆盖 DoWork(int i)?这不是违背了open/closed principle吗?

请注意,我没有因此而破坏任何实际甚至理论上的代码,请记住,我只是从 C# 开始,所以我可能在这里遗漏了一些东西。

代码实践在不同的编程语言中基本保持不变,例如 C# 和 Java。

假设您仍在使用良好的面向对象设计,我认为这样做没有任何问题。只需确保您没有不小心弄乱第一个具体 class(在本例中为 D)中的原始功能。这是我唯一要注意的问题。

关于您转向 C#,我想您会很快爱上 .NET 并且想知道没有它您是怎么过的!

祝您使用新语言好运。希望这对您有所帮助:)