19

重复接口与基类


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

谢谢, 布赖恩霍奇 hodgedev.com

4

3 回答 3

34

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

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

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

此外,如果您尝试创建特定的对象继承层次结构,您真的不想尝试仅使用接口来执行此操作。

同样,在某些语言中,你只能有一个基类,如果一个对象已经有一个基类,你将不得不进行一些重构才能使用抽象基类。这可能意味着也可能不意味着您可能想要使用接口。

正如@tvanfosson 所说,使用大量接口并不是一个坏主意,当您真正了解抽象类和接口时,这并不是一个非此即彼的情况。特定情况可以使用抽象类和接口,也可以不使用。我有时喜欢使用接口来限制方法或对象可以访问传入参数对象的内容。

于 2009-02-17T18:34:35.737 回答
4

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

于 2009-02-17T18:41:09.213 回答
2

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

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

The only situation where I can see that providing an interface in such a situation would not be desired is where you want to restrict it so that only your implementation can be used. Using the abstract class and having certain methods be not be virtual would enforce the use of your code in all circumstances where the implementer is deriving from your class.

于 2009-02-17T18:56:52.250 回答