Java 继承与抽象母题传递

Java 继承与抽象母题传递,java,inheritance,Java,Inheritance,我有以下课程: Abstract class A Abstract class B extends A class C1 extends B class C2 extends B class C3 extends B 类C1、C2、C3实现了相同的抽象方法: public MyItem getItem() 在另一个类(比如X类)中,我有(想要有…)功能: void testFunction(A classA) { MyItem myItem = classA.getItem();

我有以下课程:

Abstract class A
Abstract class B extends A
class C1 extends B
class C2 extends B
class C3 extends B
类C1、C2、C3实现了相同的抽象方法:

public MyItem getItem()
在另一个类(比如X类)中,我有(想要有…)功能:

void testFunction(A classA)
{
   MyItem myItem = classA.getItem();
   ...
}
但是当我这样做的时候,我得到了编译错误

我不明白为什么?为什么我不能编写void testFunction(classA)呢? (我知道C++中我能做到)


谢谢

问题是您可能没有在类
A
中定义方法
getItem()

您可以通过在类
a
中简单地添加这一行来定义它(如果您不想要/can,则不必指定它的具体实现):

abstract public MyItem getItem();
通过这种方式,方法签名在类
A
中定义,因此,当您将对象声明为类
A
时,可以调用它

然后,扩展
A
的所有具体类(例如类
C1
C2
C3
)必须通过重写来强制实现方法
getItem()
。您还可以在方法实现之前添加
@Override
符号,例如:

class C1 extends B {

   @Override
   public MyItem getItem() {
      //concrete implementation
   }
}

抽象方法是在哪个类中定义的?A还是B?你会得到什么编译错误?指定导致编译错误的行和错误是什么,这将有帮助。在没有更多的解释的情况下,我不能看到这里有什么东西,C++和java会有很大的不同。难道你不想说“我知道在Java脚本中我可以做到”?:)另外,作为旁注,您的命名
testFunction
表明您来自Java脚本世界:)。。检查是否可以使用接口而不是抽象类