我有一个接口 myinterface 带有两种方法 dosomething ()和 dosomethingelse ()P>
我有一个抽象的公共类 a 实现此接口。我有一个 c 的类,该类别扩展了类 a ,因此也实现了接口的方法。在主方法上,我将C类的对象分配给myinterface引用,例如:myinterface myiface = new C();
问题是,如果我在类(摘要或具体)中添加一些方法,则无法通过参考myiface调用该方法。我必须先击败它。我不应该像 java se8中显示的deitel 程序员(第10章多态性和界面)中所示的多态访问该类?
这样想到它...想象您的myinterface被命名为'Animal',您有两个类实现它,命名为'Dog'和'Cow'。仅仅因为它们是两种动物,您就不会指望狗突然给牛奶喂牛奶,对吗?在此类比中,givemilk()是一种仅由牛类实施的方法。
您明白了吗?
我不应该能够多态访问该类...
您可以 - 如果您的变量类型为C
类型。但事实并非如此,它是MyInterface
类型的,它完全定义了您可以访问的实例的功能。是的,实例具有更多功能,但是写在接口上的代码不知道。
在C
中添加功能与多态性无关。在这种情况下,多态性(有几种不同的类型)是A
和C
可以以不同的方式实现MyInterface
的功能 ,但是您的代码通过 MyInterface
参考均不知道。也不关心这些实例为 A
s或 C
s;它只知道应该知道的只是他们声称是忠实的MyInterface
实施。
让我们以一个具体示例:
public void doSomethingWith(List list) {
// ...
}
当某物调用doSomethingWith
时,它会在满足List
接口的实例中传递。那是所有该方法知道该实例(不存在诸如instanceof
和getClass
之类的事物)。该实例可以是ArrayList
,LinkedList
,A Stack
等。但是使用它的代码不知道或关心这一点。它所知道的是它是List
。即使通过ArrayList
传递该方法,它也无法使用(SAS)ensureCapacity
,而不会先降低引用(如果实例不是ArrayList
),因为并非所有List
实现都有ensureCapacity
。