相同instanceof但不同类的方法不可见性

Posted

技术标签:

【中文标题】相同instanceof但不同类的方法不可见性【英文标题】:Method nonvisibility of same instanceof but differing class 【发布时间】:2015-08-30 11:31:21 【问题描述】:

我有类似下面的内容:

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上调用一系列方法:

// will only return true if var was initialized as Truck
if (/*conditions*/) 
    var.someMethod();
    var.exclusiveMethod();
 else 
    var.someMethod();

Netbeans 弹出一个exclusiveMethod() 找不到的错误,因为它不在Item 中。只有当var 初始化为Truck 时,我才需要exclusiveMethod() 的方法可见性。不过,我有一些限制:Item var; 必须在其他逻辑之前出现在我的代码中,并且我无法创建一个接口,然后在ItemTruck 中实现该接口。我也根本无法修改public class Item

我能做什么?

【问题讨论】:

请参考Java继承 你不能在Item上调用Truck的方法,你必须使用casting。 将包含此 if 语句的代码放入类 Item 的方法中。并且在类Truck覆盖该方法并在那里以不同的方式实现它(也称为exclusiveMethod)。并阅读面向对象编程,这将解释为什么这是正确的方法。 @ErwinBolwidt,我无法修改类Item:无法添加或编辑。 简单地说,您想有条件地调用其中一个方法 - 按照两个答案中的建议,使用 instanceof 检查您的对象。 【参考方案1】:

您可以使用反射 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()

【讨论】:

演员选项更好 是的,我只是给出了所有可能的选项。【参考方案2】:

这是基本的 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();

【讨论】:

【参考方案3】:

从你的问题我了解到,如果用户输入是 1,那么 var 将被实例化为 Truck 否则它应该被实例化为 Item。该代码是可行的。我感觉你调用exclusiveMethod()方法有问题,你可以使用instanceof检查实例,然后调用如下方法:

if (var instanceof Truck) 
    var.someMethod();
    ((Truck)var).exclusiveMethod();
 else 
    var.someMethod();

【讨论】:

以上是关于相同instanceof但不同类的方法不可见性的主要内容,如果未能解决你的问题,请参考以下文章

WPF 在编辑时设置默认可见性值

PHP中默认类的可见性是啥?

如何始终保持窗口可见,但不强制它位于顶部

QTabView 隐藏选项卡内容但不隐藏选项卡栏

当我调用可见性时,Android 动画不起作用

高库存。不更新导航器系列可见性