【发布时间】:2015-08-29 02:40:16
【问题描述】:
作为一名将自己介绍给 C# 的 Java 程序员(初学者),我发现您可以像这样重新抽象一个已经实现的方法(代码来自 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.
}
}
我知道这不会使 D 类中的原始实现完全不可用,仅对通过子类化 E(重新抽象方法的类)子类化它的 D 的子类不可用,因此不应该如果 D 类在生产中,会导致任何实际问题。
我仍然想知道,这不是在修改 D 类的合约吗,它没有指定子类必须覆盖 DoWork(int i)?这不是和open/closed principle相反吗?
请注意,我没有任何实际甚至理论上的代码被此破坏,请记住,我只是从 C# 开始,所以我可能会在这里遗漏一些东西。
【问题讨论】:
-
被这个打破了?整个 WinForms 以及 WPF 都是基于此。
-
一个覆盖方法仍然可以调用它覆盖的方法。例如
public override void DoWork(int i) { return base.DoWork(i); }。这允许开发人员在一定程度上扩展该方法的功能,因此我想说它仍然坚持开放/封闭原则,因为您没有直接修改原始方法。 -
as a java programmer- 你会发现 C# 中的很多东西可能超出了你当前的参考框架,无论你有多少年的 Java 编程经验,这都是非常有限的。保持开放的心态,尽管 Java 及其拒绝任何进化和进步的现状哲学可能让你相信,语言特性都可以帮助你。 -
@HighCore 很高兴触摸到最后,让我微笑:)
-
@HighCore 谢谢你,我认为这是一个很大的提示。我会尽量保持开放的心态! @Eraph 据我了解抽象方法我不能在 E 类中执行
public abstract override void DoWork(int i) { return base.DoWork(i); },这将是唯一可以调用base.DoWork(i);并访问 D 类实现的人。此外,我不能在 F 类中执行public override void DoWork(int i) { return base.DoWork(i); },因为 E 类(F 类的基础)将其声明为抽象。