动态地将方法体重新分配给对象

时间:2012-06-01 12:06:58

标签: java class dynamic methods override

是否可以让类A使用空方法说render() ..然后你创建3个类的实例,所以你有对象b, c, d,所以我可以分配每个对象的渲染方法的主体?

以下是一个示例,在JavaScript中,您可以让对象说a,然后在任何可以说的地方

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

在该行之后,您将拥有一个名为method的方法,用于对象a,并且只要它被调用/* do something */

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

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

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

您可以非常实例化A类的子类,并覆盖您喜欢的方法。像这样

A a = new A(){
   @Override
   public void render(){
       //do something
   }
};
A b = new A(){
    @Override
    public void render(){
        //do something
    }
}

答案 2 :(得分: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
  }
};

答案 3 :(得分:1)

不,你不能用Java做到这一点。方法的实现完全取决于其对象的运行时类型。

但您可以使用策略模式,它实际上是由标准Swing框架完成的(或多或少):您可以将Action设置为JButton,并{{1单击按钮时会调用Action方法。它只是对象之间的委托。

答案 4 :(得分: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   
    }
}

答案 5 :(得分:0)

嗯,说实话,听起来像java中的纯多态,可以通过两种方式实现:

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

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

http://java.sys-con.com/node/37695

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