1

是否有可能有A一个空方法的类说render()..然后你创建了该类的 3 个实例,所以你有 objects b, c, d,那么我可以为每个对象的 render 方法分配主体吗?

这是一个例子,在 JavaScript 中你可以让一个对象说a,然后在任何你可以说的地方

a.method = function() { /* do something */ }

在该行之后,您将拥有一个带有method对象名称的方法,a并且无论何时调用它都会/* do something */

这在 Java 中是否可行,语法是什么?

我的想法是有一个button类并在它使用的不同情况/上下文中为其实例的方法分配不同的操作click,因此我不必为每个操作定义不同的子类。

4

6 回答 6

6

在 Java 中,您不能像在 Javascript 中那样传递函数。

您需要创建一个名为(最好是更具描述性的!)的接口Handler,它声明您要调用的方法。然后你可以做类似这样的事情:

a.method = function() { /* do something */ }

但你必须将其表述为

a.method = new Handler() {
    public void function() {
        /* do something */
    }
};

并将其称为a.method.function().

我的想法是有一个button类并在它使用的不同情况/上下文中为其实例的方法分配不同的操作click,因此我不必为每个操作定义不同的子类。

这正是 Swing 的做法。它通常看起来像这样:

myButton.setAction(new AbstractAction("Click me!") {
    public void actionPerformed() {
        // do something
    }
});
于 2012-06-01T12:08:31.427 回答
3

您可以异常地实例化该类的子A类并覆盖您想要的方法。像这样

A a = new A(){
   @Override
   public void render(){
       //do something
   }
};
A b = new A(){
    @Override
    public void render(){
        //do something
    }
}
于 2012-06-01T12:11:07.647 回答
1

如果只想实例化具有render方法的类的一个对象,可以使用委托;如果课程是重量级课程,您可能想要这样做。

这实际上是策略模式

class MyClass {
    private Behavior behavior;

     public void setBehaviour(Behavior someBehaviour) {
         this.behavior = someBehavior;
     }
     public void render() {
         behavior.render();
     }
}

interface Behavior {
     void render(); 
}

class BehaviorA implements Behavior {
     public void render() {
         //do behavior A 
     }
}

class BehaviorB implements Behavior {
     public void render() {
         //do behavoir B
     }
}

class RunnerClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        myClass.setBehavior(new BehaviorA()); //actually you should put a factory for behavioir
        myClass.render();//render A logic is done
        myClass.setBehavior(new BehaviorB());
        myClass.render();//render B logic is done   
    }
}
于 2012-06-01T12:36:19.343 回答
1

实例化类不能定义方法体,但实例化A可以定义方法体。

interface A {
  void method();
}

A b = new A() {
  @Override
  public void method() {
    //body for instance b
  }
};

A c = new A() {
  @Override
  public void method() {
    //body for instance c
  }
};
于 2012-06-01T12:10:23.833 回答
1

不,你不能在 Java 中做到这一点。方法的实现完全由其对象的运行时类型决定。

但是您可以使用策略模式,这实际上是标准 Swing 框架所做的(或多或少):您可以将 an 设置Action为 a JButton,并在单击按钮时调用Action'方法。actionPerformed()这只是对象之间的委托。

于 2012-06-01T12:11:05.650 回答
0

好吧,老实说,这听起来像是 java 中的纯多态性,可以通过两种方式实现:

  • 要么创建一个公共接口,您的每个对象都以不同的方式实现

  • 定义一个抽象类按钮并创建扩展抽象按钮的 b、c、d 按钮并以不同方式定义每个按钮的行为。

http://java.sys-con.com/node/376​​95

http://www.javaworld.com/javaworld/javatips/jw-javatip30.html

于 2012-06-01T12:17:24.060 回答