我正在阅读GoF的设计模式,我开始怀疑。如果你在C#这样的语言中使用抽象的作为接口,那么接口是否是多余的?让我们暂时搁置多个继承,据我所知,你只能通过接口实现(在C#中)。
我正在尝试将此逻辑应用于C#中的DDD。我见过的几乎所有示例和实现都使用接口。我开始想知道为什么了。是否可以使用抽象类?在我看来,这将是一个更强大的解决方案,但后来我可能会遗漏一些东西,这就是我在这里问的原因。
要点:
注意: 我已经阅读了列出的所有类似问题,但似乎没有人给我答案。如果我错过了,请告诉我。
答案 0 :(得分:3)
对于问题1:无论多重继承接口的支持是合同规范,抽象类都是基类。
接口为类提供了一种指定一组功能的方法(想想IDisposable,IEnumerable等),并建议他们服从Interface Segregation Principle。
抽象类应该实现一个可以扩展的概念,或者根据上下文可以有不同的实现(想想HttpContextBase,AbstractButton等)。
接口和抽象类之间的最大区别是概念性的。您可以认为,除了继承之外,接口与仅使用抽象方法的抽象类相同,但从概念上讲,它们代表不同的东西。
关于问题2:在DDD接口的上下文中是实现细节。我敢说你可以做DDD而不使用接口或抽象类,甚至继承。只要您拥有有界的上下文,聚合,实体和VO就可以很好地定义。
总之,当您尝试表达合同时使用接口时,如果要表明您的类具有某种功能,请实现接口。如果您有一个可以根据上下文提供更多实现的概念,请使用基类(抽象与否)。
当你这样想时,语言制定者(c#)决定只允许单一继承,但允许实现多个接口是很有意义的。
答案 1 :(得分:1)
Interfaces的优势正是没有多重继承。通过使用接口,您可以允许类,如Forms,UserControls,Components等参与交互,否则这些交互将是难以实现的。
我建议同时做这两件事。我通常创建一个接口,然后(如果可能的话)创建一个继承该接口的抽象类,以提供该接口的任何常见或默认实现。这给你两全其美。
答案 2 :(得分:1)
接口不是多余的。接口独立于实现,而抽象类是实现。如果某些实现类发生更改,则不必更改或重新编译使用接口的代码。
优势在于上面。如果您正在进行ddd,请从具体类开始并编写一些测试。将常见的东西重构为基类(有些将是抽象的)。如果有理由让接口继续进行并且这样做。重复直到完成。