Java - 如果object是classA或classB的实例,请执行

时间:2016-05-24 04:04:16

标签: java

我知道还有很多类似的问题,但我认为我的情况稍有不同,因为我找不到一个效果很好的解决方案。我会尝试解释..

我正在使用libgdx游戏框架,它包含类TextFieldTextAreaTextAreaTextField的扩展,它有一些额外的方法并覆盖了一些TextField方法,正如人们可能猜到的那样,它增加了多行文本的能力。< / p>

我希望这两个类都包含其他但相同的方法,因此我使用类TextFieldExtTextAreaExt扩展了它们。让我们说在这两个方面我添加了方法doMethod1()doMethod2()

所以,当我遇到ActorsTextField时,我正在遍历TextFieldExt(这是TextAreaExt和其他许多对象的超类)希望它执行某些操作并运行doMethod1()doMethod2()

现在我想要的是这样的东西;

if(actor instanceof TextFieldExt || actor instanceof TextAreaExt){
    (...) actor.doMethod1();
}

我知道这是不可能的,任何类型的演员或声明都不会允许它,因为在Java的眼中,不能保证这些方法存在。

所以我试着在两个类中构建一个具有我需要的方法的接口,感觉就像它以正确的方式进行,但我仍然无法使它工作。例如,我有;

public interface ExtendedTextElement {
   public void doMethod1();
   public void doMethod2();
}

然后在我的扩展课程中;

public class TextFieldExt extends TextField implements ExtendedTextElement
public class TextAreaExt extends TextArea implements ExtendedTextElement

在我的条件声明中,我尝试了;

if(actor instanceof ExtendedTextElement){ ...

显然,这不起作用,因为无法保证实例是TextFieldTextArea的扩展名,因此我无法访问基本方法。

所以我被卡住了。我可以通过单独的条件语句和重复的代码来手动工作,但它是相当多的代码,我宁愿有适当的解决方案。

1 个答案:

答案 0 :(得分:1)

这不适用于所有用例,但如果你需要做的就是调用发生的方法,由TextFieldTextArea定义,您可以将该方法添加到您的界面,例如:

public interface ExtendedTextElement {
   public void doMethod1();
   public void doMethod2();
   public void setText(String t);
}

您没有说明您需要哪些类别的方法,但由于它们都扩展了TextComponent,您还可以尝试将对象转换为TextComponent。这适用于在共享父类中定义的任何方法(如setText())。

这不适用于TextField / TextArea情况,但如果您正在处理共享接口(而不是父类)的类,则可以定义接口以扩展该接口一,从而强制您的接口的每个实例也是共享接口的实例,不需要instanceof检查。

public interface ImaginaryTextComponentInterface {
   public void setText(String t);
}

public interface ExtendedTextElement extends ImaginaryTextComponentInterface {
   public void doMethod1();
   public void doMethod2();
}