我有类似下面的内容:
public void OnPrintClick(IRibbonControl control , ref bool cancel)
{
MessageBox.Show("PRINT !");
}
根据用户输入,它将被初始化为不同的类:
Item var;
这些类定义为:
if (/*user input*/ == 1) {
var = new Item();
} else {
var = new Truck();
}
注意public class Truck extends Item {
public void someMethod();
public void exclusiveMethod();
}
public class Item {
public void someMethod();
}
有一个Truck
所没有的专有方法exclusiveMethod()
。根据某些条件,将在Item
上调用一系列方法:
var
Netbeans弹出错误// will only return true if var was initialized as Truck
if (/*conditions*/) {
var.someMethod();
var.exclusiveMethod();
} else {
var.someMethod();
}
无法找到,因为它不在exclusiveMethod()
中。仅当Item
初始化为exclusiveMethod()
时,我才需要var
的方法可见性。但是我有一些限制:Truck
必须在我的代码之前在其他逻辑之前,我不能创建一个接口,然后我在Item var;
和Item
中实现。我也无法修改Truck
。
我该怎么办?
答案 0 :(得分:4)
您可以使用反射API来调用exclusiveMethod
。
代码看起来像 -
Method m = var.getClass().getMethod("exclusiveMethod", null);
if(m != null) {
m.invoke(var, null);
}
您可以在此处获取有关relfection API的更多信息 - http://docs.oracle.com/javase/tutorial/reflect/index.html
另一种获得此方法的方法是将var
强制转换为Truck
,如果您确定var是Truck
类型的对象。该示例代码为 -
if(var instanceof Truck) {
((Truck)var).exclusiveMethod()
}
答案 1 :(得分:2)
从你的问题我明白,如果用户输入为1,则var
将被实例化为Truck
,否则应将其实例化为Item
。代码是可行的。调用方法exclusiveMethod()
时我觉得您遇到问题,您可以使用instanceof
检查实例,然后按如下方式调用方法:
if (var instanceof Truck) {
var.someMethod();
((Truck)var).exclusiveMethod();
} else {
var.someMethod();
}
答案 2 :(得分:1)
这是基本的OOP多态性。在超类(Item)中定义一个空的exclusiveMethod(),然后在Truck中添加一些代码覆盖它。你不会需要任何if语句或类检查。
public class Item {
public void someMethod() {
// do something
}
public void exclusiveMethod() {
}
}
public class Truck extends Item {
@Override
public void someMethod() {
// do something else
}
@Override
public void exclusiveMethod() {
// implement me
}
}
...
Item item = getItemOrTruck(...);
item.someMethod();
item.exclusiveMethod();