C#重新抽象是不是违反了开放/封闭原则?

Posted

技术标签:

【中文标题】C#重新抽象是不是违反了开放/封闭原则?【英文标题】:Does C# re-abstracting violate the open/closed principle?C#重新抽象是否违反了开放/封闭原则? 【发布时间】: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 类的基础)将其声明为抽象。 【参考方案1】:

跨不同编程语言(例如 C# 和 Java)的代码实践基本保持不变。

假设您仍在使用良好的面向对象设计,我认为这样做没有任何问题。只要确保您不会意外地弄乱第一个具体类中的原始功能(在这种情况下为D)。这是我唯一要注意的问题。

关于您切换到 C#,我想您很快就会爱上 .NET,并想知道如果没有它,您是怎么过的!

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

【讨论】:

请投赞成票,尽管我不能 100% 确定我同意你的第一句话。编码实践保持不变,除了那些在 Java 中很常见并且与 C# 的语言特性完全无关的代码实践(例如,Java 中可怕的“匿名内部类”事物,由于缺乏真实事件等,这是一个糟糕的解决方法) ) 我明白了。所以我必须小心,我不需要在 Java 中!只是在开玩笑。谢谢你的回答!到目前为止,我喜欢我所看到的,并且我已经在考虑在大学这个学期的要求之外进一步学习并实际学习 C#。因此问题:) @Blueriver 祝您的课程好运! C# 是我个人最喜欢的,但我建议你使用任何你觉得最舒服的东西:)

以上是关于C#重新抽象是不是违反了开放/封闭原则?的主要内容,如果未能解决你的问题,请参考以下文章

我是不是违反了“开放/封闭”原则?

开放封闭原则|SOLID as a rock

Objective C 类别 vs 开放/封闭原则

day21接口类和抽象类,隔离原则,开放封闭原则,多态

开放封闭原则

设计模式--开放封闭原则