有一个抽象类实现接口的好处?

时间:2011-09-29 15:32:32

标签: .net oop inheritance interface abstract-class

我最近询问了这个question是否应该实现接口或抽象类。斯科特给出了答案,建议我同时使用两者,但我仍然不确定为什么我会这样做。从长远来看是否有好处?这样做有什么好处?

我认为以下是一些好处:

  • 我可以在不破坏实现的情况下为抽象类添加方法,但是对于接口,我会打破它。
  • 我可以从多个接口继承,但只能从一个抽象类继承
  • 抽象类允许我定义标准行为,但如果我愿意,则覆盖它。

这是另一个问题。如果我实现了一个接口,那么接口是否只包含所有子类都可以做的方法?如果我需要额外的逻辑,我会创建一个具有更具体实现的具体类或抽象类。

3 个答案:

答案 0 :(得分:6)

这种方法为您提供了两全其美的优势 - 接口的灵活性和基类的有用选项。

要求消费者实现你的接口,你不会强迫他们失去对他们的类开放的唯一继承槽(C#不允许多重继承)。

但是通过另外提供一个抽象基类,你可以给它们一个“支持”,也许是通过实现一些辅助功能,这可能是你的界面的大多数实现的常见要求 - 例如,这可以使用模板方法模式来实现。

.NET Framework本身有几个示例,它们都是公开的接口和基类。例如System.ComponentModel.IComponentSystem.ComponentModel.Component

  

这是另一个问题。如果我实现一个接口,应该   interface只包含所有子类都可以执行的方法吗?

是。你基本上是在描述Interface Segregation Principle

答案 1 :(得分:2)

界面将定义合同。任何实施者(直接或通过抽象实施者)都符合本合同。

抽象类意味着您可以跨具体实现重用实现的某些部分 - 您可以拥有多个抽象类,实现方式不同。

答案 2 :(得分:1)

我在这里假设C#,因为另一个问题有一个C#标签

显而易见的好处是,将来你有另一个类,它已经从基类继承,并且你想将它传递给接受它的方法。 。 。

你不能把第一个基类放在那里,因为C#并不是所有的多重继承,所以你永远不能传递那个子类不同的类的对象。

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

两者都意味着基类可以实现适合你的接口,因为你可以在其中放置通用逻辑,你不需要重复自己,或者在“helper”类中有一堆静态方法。

此外,如果你有其他想要使用的类,它们不必继承基类,那么就可以实现接口。

希望这是有道理的:)