2

让我用一个例子来澄清我的问题。假设我有一个interface Iin which 方法abc()被定义。我还有另外两个类说AB它们实现了 I 并覆盖 abc() 方法。

现在我的问题是为什么我们用户界面只是为了定义方法而不是直接在类中实现而不定义和实现接口?比如......

interface I{
    public void abc();
}
class A implements I{
  @Override
  public void abc() { ... }
}
class B implements I{
  @Override
  public void abc() { ... }
}

代替

class A {
  public void abc() { ... }
}
class B {
  public void abc() { ... }
}


用小例子进行解释将非常有帮助。谢谢你。

4

5 回答 5

2

可以,如果你愿意,但你将无法治疗AB相同。没有办法共同获取类型对象A并将B它们混合在一起,同时仍然能够调用该abc()方法。

于 2013-08-27T04:16:55.607 回答
1

想象一下,您有一个处理宠物的应用程序。您可以拥有多种类型的宠物,但它们都具有相同的内部形状和功能。所以当你有一个像 getPet() 这样的函数时,你可以为 Dogs Cats 等返回相同的接口。

一旦有了 Pet 对象(可能是 Dog 或 Cat),您就可以执行相同的函数,例如 feedPet(),它会根据真实的 Pet 具有不同的实际代码。

如果您不坚持使用接口,您将需要为每个不同的宠物提供不同的功能。想象一下,如果您想添加一个新宠物,您需要更改的代码。

抱歉有点做作,但我希望你能明白。

于 2013-08-27T04:18:41.973 回答
1

使用接口允许分离接口和实现。假设我们有另一个依赖于abc接口的类。将这个函数封装在一个接口中I允许这个类与多个实现一起工作,abc而不必知道(依赖于)实现的特定类abc,从而导致耦合更少,因此系统更开放。

请注意,某些语言,例如 Python,使用“duck”类型。任何在参数上调用o.abc()的函数都可以在需要AB不需要以任何其他方式表达它们的公共接口的情况下调用。静态类型语言需要不同的机制。

于 2013-08-27T04:22:28.177 回答
1

在这里使用接口I的好处是:

我们可以说任何暴露的对象abc()都可以放在同类型的桶。因此,任何实现 abc() 的对象都是类型 I。我们可以充分利用这些额外的信息。它是一种极好的抽象方式:

任何带有发动机和轮子的机器都是车辆

于 2013-08-27T04:23:40.807 回答
0

除了前面的答案,如果两者都以相同A的方式B实现方法abc,您总是可以考虑创建I一个抽象类而不是接口。因此,您将获得与其他响应中列出的继承相同的好处,并且只需执行一次该方法即可。

这是一篇关于使用抽象类和接口的文章以供进一步参考: 文章:JavaWorld

于 2013-08-27T06:10:04.697 回答