为了账号安全,请及时绑定邮箱和手机立即绑定

接口与基类

接口与基类

接口与基类什么时候应该使用接口,什么时候应该使用基类?如果我不想实际定义方法的基本实现,那么它应该始终是一个接口吗?如果我有狗和猫课。为什么我想要实现IPet而不是PetBase呢?我可以理解ISheds或IBarks的接口(IMakesNoise?),因为它们可以通过宠物放置在宠物上,但我不知道通用宠物使用哪种接口。
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

让我们以狗和猫类为例,让我们用C#来说明:

狗和猫都是动物,特别是四足哺乳动物(动物太普遍了)。让我们假设你有一个抽象的哺乳动物类,它们都是:

public abstract class Mammal

此基类可能具有默认方法,如:

  • 饲料
  • 配偶

所有这些行为在任何一个物种之间都有或多或少相同的实现。要定义这一点,您将拥有:

public class Dog : Mammalpublic class Cat : Mammal

现在让我们假设还有其他哺乳动物,我们通常会在动物园看到:

public class Giraffe : Mammalpublic class Rhinoceros : Mammalpublic class Hippopotamus : Mammal

这仍然是有效的,因为在功能的核心Feed()Mate()还是一样的。

然而,长颈鹿、犀牛和河马并不完全是你可以用来做宠物的动物。在这里,接口将是有用的:

public interface IPettable{
    IList<Trick> Tricks{get; set;}
    void Bathe();
    void Train(Trick t);}

上述契约的实现在猫和狗之间将是不一样的;将它们的实现放在一个抽象类中进行继承将是个坏主意。

您的狗和猫定义现在应该如下所示:

public class Dog : Mammal, IPettablepublic class Cat : Mammal, IPettable

理论上,您可以从更高的基类重写它们,但从本质上说,接口允许您只将所需的内容添加到类中,而不需要继承。

因此,因为通常只能从一个抽象类继承(在大多数静态类型的OO语言中,即.异常包括C+),但能够实现多个接口,它允许您严格地构造对象视需要基础。


查看完整回答
反对 回复 2019-06-01
?
慕的地10843

TA贡献1785条经验 获得超8个赞

乔希·布洛赫自己说有效Java 2d:

比抽象类更喜欢接口

一些要点:

  • 现有的类可以很容易地进行修改,以实现新的接口。..您所要做的就是添加所需的方法(如果它们还不存在),并向类声明中添加一个Implements子句。

  • 接口是定义混合器的理想方法。..松散地说,Mixin是一个类除了它的“主类型”之外还可以实现的类型,以声明它提供了一些可选的行为。例如,可比较是一个混合接口,它允许类声明其实例是相对于其他相互比较的对象排序的。

  • 接口允许构造无层次的类型框架。..类型层次结构对于组织某些事情是很好的,但是其他的事情并不能整齐地归入一个僵化的层次结构中。

  • 接口支持安全、强大的功能增强。通过每班包装成语。如果您使用抽象类来定义类型,那么您将使希望添加功能的程序员别无选择,只能使用继承。

此外,您可以结合接口和抽象类的优点,提供一个抽象的框架实现类来与您导出的每个重要接口一起使用。

另一方面,界面很难进化。如果将一个方法添加到一个接口中,它将破坏它的所有实现。

PS:买这本书。这要详细得多。


查看完整回答
反对 回复 2019-06-01
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

现代风格就是定义ipet佩特基。

该接口的优点是其他代码可以使用它,而不与其他可执行代码有任何联系。完全“干净”此外,接口也可以混合。

但是基类对于简单的实现和常见的实用程序很有用。因此,还提供一个抽象基类来节省时间和代码。


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 679 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信