![]() |
1
35
作为第一条经验法则,我更喜欢抽象类而不是接口, based on the .NET Design Guidelines . 这种推理比.NET应用的范围广得多,但在书中有更好的解释。 Framework Design Guidelines . 抽象基类首选项背后的主要原因是版本控制,因为您总是可以在不破坏现有客户机的情况下向抽象基类添加新的虚拟成员。使用接口是不可能的。 在某些情况下,接口仍然是正确的选择(尤其是在您不关心版本控制的情况下),但了解其优点和缺点可以使您做出正确的决定。 因此,作为我继续之前的一个部分答案:只有当您首先决定对接口进行编码时,同时拥有接口和基类才有意义。如果您允许一个接口,那么您必须只针对该接口进行编码,否则您将违反Liskov替换原则。换句话说,即使提供实现接口的基类,也不能让代码使用该基类。 如果您决定对一个基类进行编码,那么拥有一个接口是没有意义的。 如果决定对接口进行编码,则具有提供默认功能的基类是可选的。这是不必要的,但可能会加速实现者的工作,所以您可以提供一个作为礼貌。 在ASP.NET MVC中有一个很好的例子。请求管道在IController上工作,但有一个控制器基类通常用于实现行为。 最后一个答案:如果使用抽象基类,请仅使用它。如果使用接口,则基类是对实现者的可选礼节。 更新: 我 不再 比起接口,我更喜欢抽象类,而且我很久没有这样做了;相反,我更喜欢组合而不是继承,使用solid作为指导原则。 (虽然我可以直接编辑上面的文本,但这将彻底改变文章的性质,而且由于一些人发现它有足够的价值去投票,我宁愿让原文站着,而不是添加这个注释。文章的后一部分仍然有意义,因此删除它也是一个遗憾。) |
![]() |
2
20
我倾向于使用基类(抽象的或非抽象的)来描述什么东西 是 ,而我使用接口来描述 能力 物体的 猫 是一个 哺乳动物,但其中之一 能力 是不是很可爱? 或者,换句话说,类是名词,而接口更接近形容词。 |
![]() |
3
12
来自MSDN, Recommendations for Abstract Classes vs. Interfaces
|
![]() |
4
2
如果要提供完全替换实现的选项,请使用接口。这尤其适用于主要组件之间的交互,这些组件应该总是通过接口分离。 还有一些技术原因可以选择接口,例如在单元测试中启用模拟。 在组件内部,可以直接使用抽象类访问类的层次结构。 如果您使用一个接口并具有实现类的层次结构,那么拥有一个包含实现公共部分的抽象类是很好的做法。例如。
对于更复杂的层次结构,还可以有更多的抽象类相互继承。 |
![]() |
5
2
我总是使用这些准则:
主要关注点规则规定一个类总是有一个主要关注点和0个或更多其他关注点(参见 http://citeseer.ist.psu.edu/tarr99degrees.html )然后通过接口实现的那些0或更多的其他类型,因为类随后实现了它必须实现的所有类型(它自己的以及它实现的所有接口)。 在多个实现继承的世界中(例如C++/Eiffel),人们将从实现接口的类继承。(理论上)。在实践中,它可能不会很好地工作。) |
![]() |
6
2
还有一种叫做 DRY 原则-不要重复你自己。 在您的数据源示例中,您说在不同的实现之间有一些通用代码。在我看来,最好的处理方法是使用一个包含泛型代码的抽象类和一些扩展它的具体类。 优点是,通用代码中的每个错误修复都有利于所有具体实现。 如果只使用界面,则必须维护同一代码的多个副本,这会带来麻烦。 关于抽象+接口,如果没有直接的理由,我不会这样做。从抽象类中提取接口是一种简单的重构,所以我只在实际需要时才这样做。 |
![]() |
7
0
关于一般准则,请参考以下SE问题: Interface vs Abstract Class (general OO) 接口的实际用例:
抽象类的实际用例:
Abstradt类和接口的使用: 如果要使用抽象类,可以将抽象方法移动到接口,而抽象类可以简单地实现该接口。抽象类的所有用例都可以属于这个类别。 |
![]() |
timurichk · 我的类不重写抽象方法compareTo 7 年前 |
![]() |
Steffn · angular 4中抽象类的动态多提供程序 7 年前 |
![]() |
Fabio Piunti · Abstract类子类的调用方法 7 年前 |
![]() |
Sunny Deshmukh · 可以从Java中的多个抽象类继承吗? 7 年前 |
![]() |
Donald Duck · 我可以强制C++类为非抽象类吗? 7 年前 |
![]() |
Felix · 初始化抽象类的一般变量 7 年前 |
![]() |
wheeeee · Scala对象扩展了抽象类/特征,访问伴随类字段 7 年前 |