您如何决定使用抽象类和接口? [复制]

Posted

技术标签:

【中文标题】您如何决定使用抽象类和接口? [复制]【英文标题】:How do you decide between using an Abstract Class and an Interface? [duplicate] 【发布时间】:2010-10-08 04:10:44 【问题描述】:

重复:Interface vs Base class


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

谢谢, 布莱恩·霍奇 hodgedev.com

【问题讨论】:

欺骗:***.com/questions/56867/interface-vs-base-class 略有不同,因为它指的是抽象基类,而不是所有基类。 我会删除重复的链接,但我没有那个级别的访问权限 结束这个问题很冷,因为它根本不是重复的。我认为你们已经超越了你们的收官能力。 你们在哪里解决真正需要解决的问题,比如这个:***.com/questions/306110/… 【参考方案1】:

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

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

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

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

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

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

【讨论】:

非常感谢,这很有帮助。 这是直截了当的,我点赞【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于您如何决定使用抽象类和接口? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c#中的行为抽象类和接口是啥? [复制]

有人可以帮我(新手)解释抽象类和接口吗? [复制]

我如何选择抽象类或接口..? [复制]

Java中的类和接口

scala 抽象类和trait的区别

C#中的抽象类和接口[重复]