不能在以基类为参数的函数中调用派生类方法

时间:2011-06-30 12:19:17

标签: java

我有以下问题:

class A {
   void f() {}
}

class B extends A {   
   void g() {}
}

class C extends A {
   void h() {}
}

void foo(A temp)  
{
   temp.g();
}

我希望我的foo()函数采用基类参数,因此我可以使用B& C.但是在函数内部我调用派生类方法,所以当然我得到一个错误 我也在foo函数中尝试过这个:

if(temp instanceof B)
{
   B somevar = (B)temp;
}
else if( temp instanceof C)
{
   C someVar = (C)temp;
}

someVar.g();

但是我仍然有一个编译错误,它不知道someVar是谁。我怎么能让这个工作?

感谢。

6 个答案:

答案 0 :(得分:9)

通常的解决方案是在基类中声明派生类重写的函数。

答案 1 :(得分:3)

if(temp instanceof B)
{
   B somevar = (B)temp;
   somevar.g();
}

您可以在B的实例上调用方法g(),因为该方法在B中定义。您可以在基类A类中将g()方法声明为抽象。但这意味着这种方法也存在于C

答案 2 :(得分:2)

您必须在if语句中调用各自的方法,因为someVar只能查看类A方法(如果没有进行类型转换以纠正类型)。

答案 3 :(得分:2)

if(temp instanceof B)
{
   ((B)temp).g();
}
else if( temp instanceof C)
{
   ((C)temp).g();
}
else
   return;/throw new Exception();

答案 4 :(得分:2)

使用接口怎么样?

public interface G {
  void g();
}

class B extends A implements G {
  @Override void g() {
  }
}

class C extends A implements G {
  @Override void g() {
  }
}

然后......

void foo(G temp) {
  temp.g();
}

答案 5 :(得分:1)

compileError来自于变量在Java中作用于其块的事实。这意味着当你写

if(temp instanceof B)
{
   B somevar = (B)temp;
}

somevar仅存在于if块内。

使用

if(temp instanceof B)
{
   B somevar = (B)temp;
   somevar.g();
}