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 并且想知道没有它您是怎么过的!
祝您使用新语言好运。希望这对您有所帮助:)
作为一名 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 并且想知道没有它您是怎么过的!
祝您使用新语言好运。希望这对您有所帮助:)