gpt4 book ai didi

oop - OO原理: c#: design to interface and not concrete classes

转载 作者:行者123 更新时间:2023-12-04 03:10:17 27 4
gpt4 key购买 nike

我对使用具体类和接口(interface)的影响有一些疑问。

  1. 说一些代码块(称之为chunkCode)使用具体类A。如果出现以下情况,我是否必须重新编译 chunkCode:

    1. 我向 A 添加了一些新的公共(public)方法?如果是这样,那不是有点奇怪吗?毕竟我还是提供了chunkCode依赖的接口(interface)。 (或者我是否必须重新编译,否则 chunkCode 可能永远不会知道这是真的,而且我没有省略一些 API)
    2. 我要向 A 添加一些新的私有(private)方法吗?
    3. 我向 A 添加一个新的公共(public)字段?
    4. 我向 A 添加一个新的私有(private)字段?
  2. 工厂设计模式:主代码不关心对象的具体类型是什么。它仅依赖于 API。但是,如果只与一种具体类型相关的方法很少,您会怎么做?这种类型实现了接口(interface)但是增加了一些公共(public)方法?您会在主代码中使用一些 if (A is type1) 语句(或类似语句)吗?

感谢任何澄清

最佳答案

1) 编译不是 OO 中的事件。它是特定 OO 实现的细节。如果您想要针对特定​​实现(例如 Java)的答案,那么您需要澄清。

一般来说,有人会说添加到界面不算是破坏性变更,而另一些人会说界面一旦发布就无法更改,您必须创建一个新界面。

编辑:您指定了 C#,因此请查看 this question regarding breaking changes in .Net。我不想做那个回答是一种伤害,所以我不会尝试在这里复制它。

2)人们经常破解他们的设计来做到这一点,但这表明你的设计很糟糕。

好的选择:

  • 在您的界面中创建一个方法,允许您调用自定义行为,但不需要知道该行为是什么。

  • 创建一个支持新方法的附加接口(interface)(和一个新工厂)。新接口(interface)不必继承旧接口(interface),但如果有意义(如果接口(interface)之间可以表达 is-a 关系)。

  • 如果您的语言支持,请使用 Abstract Factory pattern ,并在具体工厂中利用 Covariant Return Types 。如果您需要特定的派生类型,请接受具体工厂而不是抽象工厂。

糟糕的选择(反模式):

  • 在接口(interface)中添加一个在其他派生类中不执行任何操作的方法。

  • 在对您的派生类没有意义的方法中抛出异常。

  • 向界面添加查询方法,告诉用户他们是否可以调用特定方法。

除非方法名称足够通用以至于用户不会期望它做任何事情(例如 DoExtraProcessing),否则在大多数派生类中添加一个无操作的方法会破坏定义的契约通过该界面。

例如:有人调用 bird.Fly() 会期望它实际做某事。我们知道鸡不会飞。所以要么 Chicken 不是 Bird,要么 Bird 不会 Fly

添加查询方法是一个糟糕的解决方法。例如。在您的界面中添加 boolean CanFly() 方法或属性。抛出异常也是如此。他们都没有回避类型根本不可替代的事实。查看 Liskov Substitution Principle (LSP)。

关于oop - OO原理: c#: design to interface and not concrete classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com