方法不可见同一个实例但不同的类

时间:2015-06-15 04:10:44

标签: java class methods visibility

我有类似下面的内容:

 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

我该怎么办?

3 个答案:

答案 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();