2

我有一个接口MyInterface ,它有两个方法doSomething () 和doSomethingElse ()。

我有一个实现此接口的抽象公共类A。我有一个扩展类A的类C ,因此也实现了接口的方法。在主要方法上,我将 C 类的对象分配给 MyInterface 引用,例如: MyInterface myiface = new C();

问题是,如果我在任一类(抽象或具体)中添加一些方法,我就无法通过引用 myiface 调用该方法。我得先打消念头。我是否应该能够多态地访问该类,如Deitel 程序员的 Java SE8(第 10 章多态性和接口)一书中所示?

4

2 回答 2

1

可以这样想...想象一下您的 MyInterface 被命名为“Animal”,并且您有两个实现它的类,分别命名为“Dog”和“Cow”。就因为它们都是动物,你不会指望狗突然喂奶,对吧?在这个类比中, giveMilk() 是一个仅由 Cow 类实现的方法。

你明白了吗?

于 2017-09-02T08:28:21.993 回答
1

我不应该能够以多态方式访问该类吗...

你可以——如果你的变量的类型是 type C。但它不是,它是 type MyInterface,它完全定义了您可以访问的实例的哪些功能。是的,该实例具有更多功能,但写入接口的代码不知道这一点。

添加特性C与多态性关系不大。在这种情况下,多态性(有几种不同的类型)是A并且可以以不同的方式C实现MyInterface's 的功能,但是您通过引用使用实例的代码既不知道也不关心实例是s 还是s;它所知道的,它应该知道的,就是它们声称是.MyInterfaceACMyInterface

让我们举一个具体的例子:

public void doSomethingWith(List list) {
    // ...
}

当调用doSomethingWith时,它会传入一个满足List接口的实例。这就是该方法所知道的关于实例的所有信息(没有像instanceofand之类的东西getClass)。实例可以是 an ArrayList、 a LinkedList、 aStack等;但使用它的代码不知道也不关心这一点。它只知道它是一个List. 即使该方法传递了一个ArrayList,它也不能使用(比如说)ensureCapacity而不首先向下转换引用(如果实例不是一个,这将失败ArrayList),因为并非所有List实现都有ensureCapacity.

于 2017-09-02T08:32:03.573 回答