抽象类实现接口的好处是什么?

4

我最近在询问是否应该实现接口或抽象类的问题question。 Scottm给出了回答,建议我同时使用两种方式,但我仍然不确定为什么要这样做。 长期而言有什么好处吗?以这种方式做有哪些优点?

以下是我认为的一些好处:

  • 我可以在抽象类中添加方法而不会破坏实现,但对于接口,我会破坏它。
  • 我可以从多个接口继承,但只能从一个抽象类继承
  • 抽象类允许我定义标准行为,但如果我想要覆盖它,则可以这样做。

这里又有一个问题。 如果我实现一个接口,接口是否只包含所有子类都可以执行的方法?如果我需要额外的逻辑,我应该创建具体类或带有更具体实现的抽象类。


我在想,.net 5.0是否可以通过允许将接口与静态基类配对,并允许接口使用静态类成员声明方法和属性的默认实现来放宽限制。我认为这样做不应该有任何主要技术难点(每个接口成员都会获得虚函数表槽位,但有些会指向静态方法),这可以使接口可扩展并消除需要“伙伴”静态类来提供诸如Enumerable<T>.Empty(而不是IEnumerable<T>.Empty)的东西的需求。 - supercat
3个回答

6
这种方法给你最佳的两者结合 - 接口的灵活性和基类的有益选择。
只要求使用者实现你的接口,你就不会强制他们失去其类中唯一的继承槽 (C# 不允许多重继承)。
但是,通过另外提供一个抽象基类,你可以为他们提供一些“起点”,比如实现一些助手功能,这些功能可能是大多数接口实现所需的共同要求 - 例如,可以使用模板方法模式实现这一点。
在 .NET Framework 中有几个示例同时暴露了接口和基类。例如 System.ComponentModel.IComponent 和 System.ComponentModel.Component。

还有一个问题。如果我实现一个接口,接口中应该只包含所有子类都能做到的方法吗?

是的。你实质上正在描述 接口隔离原则

谢谢 - 我在面试中经常被问到这个问题! - Ian Nelson
我更新了我的帖子,添加了一些我认为是优点的内容,但我不确定。 - Xaisoft

2

接口将定义契约。任何实现者(直接或通过抽象实现者)都将符合此契约。

抽象类意味着您可以在具体实现之间重复使用某些实现的部分-您可以有多个不同的抽象类来实现。


1

我假设这里用C#,因为其他问题有C#标签

明显的好处是未来您将拥有另一个类,该类已从基类继承,并且您想将其传递给接受. . .的方法

您无法将第一个基类放在那里,因为C#不允许多重继承,因此您永远无法将子类化不同类的对象传递到其中。

但是,您可以在其中放置接口,因为新对象始终可以实现接口,即使它在逻辑上应该派生自基类。

同时拥有两者意味着基类可以实现适合您的接口,这对您很重要,因为您可以将公共逻辑放在其中,无需重复自己或在“helper”类中拥有大量静态方法。

此外,在将来,如果您要使用其他类,则它们不必继承基类,只需实现接口即可。

希望这有意义:)


有道理。我只能放5个标签,.NET或C#之间摇摆不定 :) - Xaisoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接