这可能是一个通用的OOP问题。我想在接口和抽象类的使用基础上做一个通用的比较。

什么时候需要使用接口,什么时候需要使用抽象类?


当前回答

对我来说,在很多情况下我会选择接口。但在某些情况下,我更喜欢抽象类。

OO中的类通常指的是实现。当我想强制一些实现细节到子程序时,我使用抽象类,否则我就使用接口。

当然,抽象类不仅在强制实现方面有用,而且在许多相关类之间共享一些特定的细节方面也有用。

其他回答

我为此写了一篇文章:

抽象类和接口

总结:

当我们谈论抽象类时,我们是在定义对象类型的特征;指定对象是什么。

当我们谈论接口和定义我们承诺提供的功能时,我们谈论的是建立一个关于对象可以做什么的契约。

我的观点是:

接口基本上定义了一个契约,任何实现类都必须遵守(实现接口成员)。它不包含任何代码。

另一方面,抽象类可以包含代码,并且可能有一些标记为抽象的方法,继承类必须实现这些方法。

我很少使用抽象类的情况是,当我有一些默认功能时,继承类可能对重写不感兴趣,比如一个抽象基类,一些专门的类继承自它。

示例(非常基本的一个!):考虑一个名为Customer的基类,它具有抽象方法,如CalculatePayment(), CalculateRewardPoints()和一些非抽象方法,如GetName(), SavePaymentDetails()。

像RegularCustomer和GoldCustomer这样的专门的类将继承自Customer基类,并实现它们自己的CalculatePayment()和CalculateRewardPoints()方法逻辑,但是重用GetName()和SavePaymentDetails()方法。

您可以向抽象类(即非抽象方法)添加更多功能,而不会影响使用旧版本的子类。然而,向接口添加方法会影响实现它的所有类,因为它们现在需要实现新添加的接口成员。

具有所有抽象成员的抽象类类似于接口。

对我来说,在很多情况下我会选择接口。但在某些情况下,我更喜欢抽象类。

OO中的类通常指的是实现。当我想强制一些实现细节到子程序时,我使用抽象类,否则我就使用接口。

当然,抽象类不仅在强制实现方面有用,而且在许多相关类之间共享一些特定的细节方面也有用。

如果您想提供一些基本实现,请使用抽象类。

我写过一篇关于何时使用抽象类和何时使用接口的文章。除了“一个是a……”之外,他们之间还有很多不同之处。一个能做……”。对我来说,这些都是事先准备好的答案。我提到了使用它们中的任何一种的一些原因。希望能有所帮助。

http://codeofdoom.com/wordpress/2009/02/12/learn-this-when-to-use-an-abstract-class-and-an-interface/