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

时间:2009-02-17 18:33:43

标签: actionscript-3 oop interface abstract-class

重复Interface vs Base class


我已经深入了解OOP,设计模式和动作脚本3的世界,我仍然很好奇如何知道何时使用Abstract类(对于不支持Abstract类的AS3的伪)和接口。对我来说,两者都只是作为模板来确保在给定的类中实现某些方法。区别仅在于抽象类需要继承而接口只是扩展吗?

谢谢, 布莱恩霍奇 hodgedev.com

3 个答案:

答案 0 :(得分:31)

如果您有一些希望它具有子类的功能,请使用抽象类。例如,如果您有一组希望所有基本抽象类的子类都具有的函数。

如果您只想获得有关行为/功能的一般合约,请使用界面。如果要将一个函数或对象包含在一组不同的对象中,请使用接口。然后,您可以更改传入的对象,而无需更改正在使用它的方法或对象。

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

此外,如果您尝试创建特定的对象继承层次结构,您实际上不希望尝试仅使用接口。

另外,在某些语言中,您只能拥有一个基类,如果一个对象已经有了基类,那么您将不得不进行一些重构以使用抽象基类。这可能意味着也可能不意味着你可能想要使用界面。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

但是,我认为这是一个虚假的困境。您不需要并且可以说不应该在接口和抽象类之间进行选择。在大多数情况下,您需要定义接口,然后让您的抽象类提供默认的框架实现(如果需要/期望)。对我来说,问题是我需要一个接口或接口和一个抽象类而不是一个接口或一个抽象类。使用该接口将您的代码与任何特定实现分离,甚至是抽象类实现。如果您应该选择使用备用实现,则使用该接口将允许此操作,而如果您只有抽象类,则必须重构以稍后添加该接口。

我可以看到在这种情况下提供界面的唯一情况是想要限制它,以便只能使用您的实现。使用抽象类并使某些方法不是虚拟的将在实施者派生于您的类的所有情况下强制使用您的代码。