1

我正在玩 Java 游戏,目前正在尝试实现菜单系统。我有一个Menu类和一个MenuBox类,我想做的是在MenuBox类中有一个抽象方法,我会在代码中的其他地方定义它,因为每个都MenuBox可以有不同的效果(暂停/取消暂停游戏,打开不同的菜单,更改选项,保存游戏等...)。

到目前为止,我已经添加了一个名为 的接口Clickable,它只有activate()在类中定义为空的方法MenuBox,我想在创建 Menu 对象时重新定义它。这甚至可能吗?我一直在研究,只发现了死胡同,但问题与我的不完全相同,所以我不确定这是否可能,或者我是否需要完全不同的方法。

下面是界面和 MenuBox 类:

public interface Clickable {
    public abstract void activate();
}

public class MenuBox implements Clickable{
    private String label;
    private int x,y,width,height;
    public MenuBox(String label,int x,int y,int width,int heigth){
        this.label = label;
        this.x = x;
        this.y =y;
        this.width=width;
        this.height=heigth;
    }
    public void activate() {
        //Empty method to redefine outside the class i.e. after instantiation
    }
}
4

2 回答 2

2

您可以使MenuBox该类成为抽象类

public interface Clickable {
    public abstract void activate();
}

public abstract class MenuBox implements Clickable{
    private String label;
    private int x,y,width,height;
    public MenuBox(String label,int x,int y,int width,int heigth){
        this.label = label;
        this.x = x;
        this.y =y;
        this.width=width;
        this.height=heigth;
    }
}

然后,当您想实例化一个新的 MenuBox 时,您可以定义抽象方法

MenuBox m = new MenuBox("",0,1,0,1){

    public void activate(){
        System.out.print("activated");
    }

};

m.activate();
于 2019-03-28T21:46:35.163 回答
1

您可以在 MenuBox 构造函数中注入一个类来委派 activate() 方法的操作。像这样的东西:

public class MenuBox implements Clickable{
    private String label;
    private int x,y,width,height;

    private ActionClass action;

    public MenuBox(String label,int x,int y,int width,int heigth, ActionClass action){
        this.label = label;
        this.x = x;
        this.y =y;
        this.width=width;
        this.height=heigth;

        this.action = action;
    }

    public void activate() {
        this.action.activate();
    }
} 

ActionClass 是一个接口,当 activate() 方法具有不同的行为时,您可以在不同的场景中注入不同的实现。

于 2019-03-28T21:34:29.697 回答