更改 class 实例中的函数体

Changing the body of a function in an instance of a class

在一个名为 Button 的 class 中,我有一个名为 onClick() 的函数。我有 2 个 Button class 实例。默认情况下,onClick() 为空 -(这里是定义:public void onClick () {})。在另一个名为 MainMenuScreen 的 class 中,我制作了 Button 的 2 个实例,但我需要一种方法来分别更改每个实例的 onClick() 按钮的主体。如果那不可能,我需要一种方法将一个函数作为另一个函数的参数,如下所示:void function (void param) {} 但我不确定这是否可行。如果您需要查看我的更多代码,请发表评论。

扩展 classes 并覆盖该方法。可以在 MainMenuScreen 中定义扩展的 classes class:

    class OtherButton extends Button {
        @Override
        public void onClick(){
            //new logic
        }
    }

Pedro 的示例非常适合您正在做的事情。作为免费赠品,您可以通过以下几种方式完成此任务。

如果 Button 只需要定义它可以做什么,那么它应该是一个接口,并让特定的 Buttons 实现它。这在处理大型应用程序时成为一个优势,因为它允许您使用 dependency inversion principle 来解耦代码。

public interface Button {
    public void onClick();
}

public class OtherButton implements Button {
    @Override
    public void onClick(){
        //new logic
    }
}

为了您的目的,您应该像上面的示例一样使用继承。但是,您询问了将功能传递给方法的问题,是的,您可以这样做。 Java 8 使用 lambdas 使这变得相当容易。

public static void main(String[] args) {

    //Use can put the logic directly in the body of the lambda
    onClick((Void v) -> {System.out.println("Button Clicked"); return null;});

    //Or you can use this to pass another method in
    onClick((Void v) -> {customOnClick(); return null;});
}

public static void customOnClick() {
    System.out.println("Button Clicked: customOnClick");
}

public static void onClick(Function<Void, Void> action) {
    action.apply(null);
}

在 Java8 以下的版本中,您可以使用匿名函数将功能传递给方法。

public static void main(String[] args) {

    onClick(new Action() {
        public void doAction() {
            System.out.println("Button Clicked");
        }
    });
}

public static void onClick(Action action) {
    action.doAction();
}

public interface Action {
    public void doAction();
}