gpt4 book ai didi

Java - 如果对象是类 A 或类 B 的实例,则执行

转载 作者:行者123 更新时间:2023-11-30 07:22:00 25 4
gpt4 key购买 nike

我知道还有很多类似的问题,但我认为我的情况略有不同,因为我找不到有效的解决方案。我会尽力解释..

我正在使用 libgdx 游戏框架,它有类 TextFieldTextAreaTextAreaTextField 的扩展,它有一些附加方法并重写了一些 TextField 方法,正如人们可能猜到的那样,它添加了能够有多行文本。

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

因此,当遇到 TextFieldExtTextAreaExt 我希望它执行一些操作并运行 doMethod1()doMethod2()

现在我想要的是这样的;

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

我知道这是不可能的,任何类型的转换或语句都不允许这样做,因为在 Java 看来,不能保证这些方法存在。

因此,我尝试构建一个接口(interface),该接口(interface)在两个类中都具有我需要的方法,感觉它的运行方式正确,但我仍然无法让它工作。例如我有;

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

然后在我的扩展类(class)中;

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

在我的条件语句中我尝试;

if(actor instanceof ExtendedTextElement){ ...

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

所以我被困住了。我可以通过使用单独的条件语句和重复的代码来让它更手动地工作,但代码相当多,我希望有一个适当的解决方案。

最佳答案

这并不适用于所有用例,但如果您所需要做的只是调用一个恰好TextField 定义的方法>TextArea,您可以将该方法添加到您的界面中,例如:

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

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

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

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

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

关于Java - 如果对象是类 A 或类 B 的实例,则执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com