我知道还有很多类似的问题,但我认为我的情况稍有不同,因为我找不到一个效果很好的解决方案。我会尝试解释..
我正在使用libgdx游戏框架,它包含类TextField
和TextArea
。 TextArea
是TextField
的扩展,它有一些额外的方法并覆盖了一些TextField
方法,正如人们可能猜到的那样,它增加了多行文本的能力。< / p>
我希望这两个类都包含其他但相同的方法,因此我使用类TextFieldExt
和TextAreaExt
扩展了它们。让我们说在这两个方面我添加了方法doMethod1()
和doMethod2()
。
所以,当我遇到Actors
或TextField
时,我正在遍历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){ ...
显然,这不起作用,因为无法保证实例是TextField
或TextArea
的扩展名,因此我无法访问基本方法。
所以我被卡住了。我可以通过单独的条件语句和重复的代码来手动工作,但它是相当多的代码,我宁愿有适当的解决方案。
答案 0 :(得分:1)
这不适用于所有用例,但如果你需要做的就是调用发生的方法,由TextField
和TextArea
定义,您可以将该方法添加到您的界面,例如:
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();
}