你如何决定使用抽象类和接口?

重复 :接口vs基类


我一直深入到OOP,设计模式和动作3的世界,我仍然很好奇如何知道何时使用Abstract类(对于不支持Abstract类的AS3伪)和接口。 对我而言,这两个模板都可以确保某些方法在给定的类中实现。 差异仅仅在于Abstract类需要继承而Interface仅仅是扩展的事实?

谢谢,Brian Hodge hodgedev.com


如果你有一些你想要它的子类的功能,可以使用抽象类。 例如,如果你有一套你希望所有基本抽象类的子类都具有的功能。

如果您只想要一个关于行为/功能的常规合同,请使用一个接口。 如果您想要在一组不同的对象中使用某个函数或对象,请使用一个接口。 然后,您可以更改传入的对象,而不更改正在使用它的方法或对象。

与抽象类相比,接口通常很宽松。 在不断地为所有接口的方法编写相同代码的情况下,您不希望使用接口。 使用抽象类并定义每种方法一次。

另外,如果你正在尝试创建一个特定的对象继承层次结构,你真的不想试图只用接口来做到这一点。

另外,在某些语言中,只能有一个基类,并且如果一个对象已经有了一个基类,那么为了使用抽象基类,你将不得不做一些重构。 这可能或可能不意味着您可能想要使用接口。

正如@tvanfosson所指出的那样,当你真正了解抽象类和接口时,使用大量接口并不是一个坏主意,但它并不是真的是一个或者两种情况。 一个特定的情况可以同时使用抽象类和接口,也可以不使用。 我喜欢使用接口,有时只是为了限制某个方法或对象可以在传入的参数对象中访问的内容。


抽象类提供了实现特定方法的可能性,并要求在继承类中实现其他方法。 使用接口,一切都必须在实现类中实现。


正如@ m4bwav所指出的,主要区别在于抽象类可以并且经常为至少某些方法提供默认实现。 这允许您使用抽象类来保持代码的干爽(不要重复自己),保持代码在抽象类本身中继承自抽象类的所有类的通用代码。

不过,我认为这是一个虚假的困境。 你不需要,也可以说不应该在接口和抽象类之间进行选择。 在大多数情况下,你需要定义接口,然后让你的抽象类提供一个默认的框架实现,如果需要的话。 对我来说,问题是我需要一个接口或一个接口和一个抽象类,而不是一个接口或一个抽象类。 使用接口可以将代码从任何特定的实现中分离出来,甚至是抽象类的实现。 如果你应该选择一个替代实现,那么使用接口就可以实现这个功能,而如果你只有抽象类,那么你必须重构以后添加接口。

在这种情况下,我只能看到提供接口的唯一情况是您限制它的位置,以便只能使用您的实现。 使用抽象类并使某些方法不是虚拟的会在实现者从你的类派生的所有情况下强制使用你的代码。

链接地址: http://www.djcxy.com/p/38141.html

上一篇: How do you decide between using an Abstract Class and an Interface?

下一篇: Interfaces vs. abstract classes