如果使用摘要作为接口,接口是否冗余?

时间:2011-10-22 14:53:09

标签: oop design-patterns interface domain-driven-design abstract-class

我正在阅读GoF的设计模式,我开始怀疑。如果你在C#这样的语言中使用抽象的作为接口,那么接口是否是多余的?让我们暂时搁置多个继承,据我所知,你只能通过接口实现(在C#中)。

我正在尝试将此逻辑应用于C#中的DDD。我见过的几乎所有示例和实现都使用接口。我开始想知道为什么了。是否可以使用抽象类?在我看来,这将是一个更强大的解决方案,但后来我可能会遗漏一些东西,这就是我在这里问的原因。

要点:

  • 问题1:在OOP的上下文中,语言只支持单继承,如果设计得当,有什么用途 接口 over 抽象类?
  • 问题2:在DDD的上下文中,如果设计得当,接口抽象类的用途是什么?

注意: 我已经阅读了列出的所有类似问题,但似乎没有人给我答案。如果我错过了,请告诉我。

3 个答案:

答案 0 :(得分:3)

对于问题1:无论多重继承接口的支持是合同规范,抽象类都是基类。

接口为类提供了一种指定一组功能的方法(想想IDisposable,IEnumerable等),并建议他们服从Interface Segregation Principle

抽象类应该实现一个可以扩展的概念,或者根据上下文可以有不同的实现(想想HttpContextBase,AbstractButton等)。

接口和抽象类之间的最大区别是概念性的。您可以认为,除了继承之外,接口与仅使用抽象方法的抽象类相同,但从概念上讲,它们代表不同的东西。

关于问题2:在DDD接口的上下文中是实现细节。我敢说你可以做DDD而不使用接口或抽象类,甚至继承。只要您拥有有界的上下文,聚合,实体和VO就可以很好地定义。

总之,当您尝试表达合同时使用接口时,如果要表明您的类具有某种功能,请实现接口。如果您有一个可以根据上下文提供更多实现的概念,请使用基类(抽象与否)。

当你这样想时,语言制定者(c#)决定只允许单一继承,但允许实现多个接口是很有意义的。

答案 1 :(得分:1)

接口不是多余的。接口独立于实现,而抽象类是实现。如果某些实现类发生更改,则不必更改或重新编译使用接口的代码。

优势在于上面。如果您正在进行ddd,请从具体类开始并编写一些测试。将常见的东西重构为基类(有些将是抽象的)。如果有理由让接口继续进行并且这样做。重复直到完成。

答案 2 :(得分:1)

Interfaces的优势正是没有多重继承。通过使用接口,您可以允许类,如Forms,UserControls,Components等参与交互,否则这些交互将是难以实现的。

我建议同时做这两件事。我通常创建一个接口,然后(如果可能的话)创建一个继承该接口的抽象类,以提供该接口的任何常见或默认实现。这给你两全其美。