让我用一个例子来澄清我的问题。假设我有一个interface I
,其中定义了abc()
方法。我有另外两个类A
和B
,它实现了我并覆盖了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() { ... }
}
用小例子解释将非常有帮助。谢谢。
答案 0 :(得分:2)
如果您愿意, ,但您将无法对A
和B
进行处理。获取A
和B
类型的对象并将它们混合在一起是没有任何共同点,同时仍然可以调用abc()
方法。
答案 1 :(得分:1)
想象一下,你有一个处理宠物的应用程序。您可以拥有多种类型的宠物,但它们都具有相同的内部形状和功能。所以当你有一个像getPet()这样的函数时,你可以为Dogs Cats等返回相同的接口。
一旦你拥有Pet对象(可能是Dog或可能是Cat),你可以执行相同的功能。 feedPet()将根据真实的Pet具有不同的实际代码。
如果您不坚持使用界面,则每个不同的宠物需要不同的功能。想象一下,如果你想添加一个新宠物,你需要改变代码。
抱歉有点做作,但我希望你明白这一点。
答案 2 :(得分:1)
使用接口可以分离接口和实现。假设我们有另一个依赖于abc
接口的类。在接口I
中封装此函数允许此类使用abc
的多个实现,而无需知道(依赖于)实现abc
的特定类,从而导致耦合少得多因此更开放的系统。
请注意某些语言,例如Python,使用“duck”类型。可以使用o.abc()
或A
调用在参数上调用B
的任何函数,而无需以任何其他方式表达它们的公共接口。静态类型语言需要不同的机制。
答案 3 :(得分:1)
在这里使用接口 I 的优点是:
我们可以说任何暴露abc()
的对象都可以放在同一类型的存储桶 I 中。因此,任何实现abc()的对象都是类型I.我们可以充分利用这些额外的信息。它是一种很好的抽象方式:
任何带引擎和车轮的机器都是车辆
答案 4 :(得分:0)
除了之前的答案,如果A
和B
同时以相同的方式实现方法abc
,您可以考虑将I
改为抽象类一个界面。因此,您可以获得与其他响应中列出的继承相同的好处,并且只需要实施该方法一次。
这是一篇关于使用抽象类和接口的文章,以供进一步参考: Article: JavaWorld