在类的实例中更改函数体

时间:2015-12-18 21:58:02

标签: java function class parameters

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

2 个答案:

答案 0 :(得分:1)

扩展类并覆盖方法。可以在MainMenuScreen类中定义扩展类:

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

答案 1 :(得分:1)

佩德罗的例子将非常适合你正在做的事情。作为免费赠品,您可以通过以下几种方式实现这一目标。

如果Button只需要定义它可以做什么,那么它应该是一个接口并让特定的按钮实现它。这在处理大型应用程序时成为一个优势,因为它允许您使用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);
}

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

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();
}