Interface 何时使用没有接口的抽象类?

Interface 何时使用没有接口的抽象类?,interface,abstract-class,Interface,Abstract Class,每当我创建一个抽象类时,我倾向于创建一个接口来配合它,并让其他代码引用接口而不是抽象类。通常,当我没有创建一个接口开始时,我会后悔(比如必须重写所有实现的方法来存根类进行单元测试,或者以后新的类不需要任何实现,重写一切也会发现自己无法扩展任何其他类) 起初,我试图通过考虑is-a vs-able来区分何时使用接口和何时使用抽象类,但后来我仍然会因为没有创建一个接口而最终受苦 因此,问题是什么时候只有一个抽象类而没有接口才是一个好主意?当您希望为派生类“提供”一些基类功能,但该功能不足以实例化可用

每当我创建一个抽象类时,我倾向于创建一个接口来配合它,并让其他代码引用接口而不是抽象类。通常,当我没有创建一个接口开始时,我会后悔(比如必须重写所有实现的方法来存根类进行单元测试,或者以后新的类不需要任何实现,重写一切也会发现自己无法扩展任何其他类)

起初,我试图通过考虑is-a vs-able来区分何时使用接口和何时使用抽象类,但后来我仍然会因为没有创建一个接口而最终受苦

因此,问题是什么时候只有一个抽象类而没有接口才是一个好主意?

当您希望为派生类“提供”一些基类功能,但该功能不足以实例化可用类时,请选择抽象类

当您希望某些类完全实现一组方法(公共契约)时,可以方便地使用接口定义此类契约,并通过使它们继承此接口将其强制到类上

简言之:

对于抽象类,您可以为派生类提供一些公共的基本功能。除非抽象类有一些存根(必须在下面实现),否则不需要进一步的操作

对于接口,您需要派生类来实现一组函数,而不需要传递任何实现

所以问题是什么时候只有一个抽象类而没有接口是个好主意

  • 当您不希望强制执行任何公共契约(由接口定义的一组方法/属性)时

  • 另外,当您不打算使用某些编码技术时,例如将对象强制转换为接口类型(运行时多态性)或限制允许的输入(某些方法参数将只接受实现某些接口的类型的对象)


好吧,只有一个抽象类而没有任何接口是有用的,主要情况是标记某个类型。能够检查一个对象是否是某个东西是很有用的。这些接口“标记”某一对象为某一类型。根据您使用的语言,应用不同的设计模式

这些抽象类存在于java中。你也可以在C++中使用RTTI。
my2c

据我所知,问题不是抽象类与接口。这是抽象类+接口vs抽象类。感谢您的编辑,如果您当时不需要接口,那么继续提供接口有什么坏处吗?我刚刚意识到,最后一个注释是语言相关的,因为在某些语言中,方法总是解析为实际类型,并受到性能的影响,而在某些语言中,您可以选择。您也许应该解释抽象类,而不是接口意味着类似于没有方法定义的类?