【问题标题】:Changing the body of a function in an instance of a class在类的实例中更改函数的主体
【发布时间】:2016-03-25 16:35:30
【问题描述】:

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

【问题讨论】:

  • 请分享它的参考代码。你还使用任何脚本语言吗?
  • 不,我没有使用脚本语言,只是使用 Java。还有什么是参考代码?

标签: java function class parameters


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Pedro 的示例非常适合您的工作。作为免费赠品,您可以通过以下几种方式来实现这一目标。

    如果 Button 只需要定义它可以做什么,那么它应该是一个接口并让特定的 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多