我有以下问题:
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是谁。我怎么能让这个工作?
感谢。
答案 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();
}