动态重新分配方法机构对象(Dynamically reassign method bodies to

2019-09-28 17:47发布

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

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

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

该行后,你将有名称的方法, method为对象a和,只要调用时,它将/* do something */

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

我的想法是有一个button类,并分配不同的行动,它的实例的click不同的情况下/上下文中使用的内部方法,所以我没有定义不同的子类的每个动作。

Answer 1:

您可以annomyously实例化的子类, A类并覆盖你想在它的方法。 像这样

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


Answer 2:

在Java中,你无法绕过的功能,你可以在Javascript。

您需要创建一个接口被称为像Handler (最好是更具描述性的!),其中声明要调用的方法。 然后,你可以做一些与此类似:

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

但你必须制定它作为

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

并把它作为a.method.function()

我的想法是有一个button类,并分配不同的行动,它的实例的click不同的情况下/上下文中使用的内部方法,所以我没有定义不同的子类的每个动作。

这正是摇摆是怎么做的。 它通常会是这个样子:

myButton.setAction(new AbstractAction("Click me!") {
    public void actionPerformed() {
        // do something
    }
});


Answer 3:

你不能定义方法体类实例化 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
  }
};


Answer 4:

不,你不能这样做,在Java中。 一个方法的实施完全由运行时类型它的对象的确定。

但是,你可以使用的策略模式,它实际上是什么正在做(或多或少)由标准Swing框架:您可以设置一个Action一个JButton ,而ActionactionPerformed()方法是在点击按钮时调用。 它是对象之间只是委托。



Answer 5:

如果你只是想实例具有渲染方法的类只有一个对象,你可以使用委托; 你可能想这样做,如果这个类是一个重量级的。

这实际上是策略模式

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   
    }
}


Answer 6:

好了,说实话这听起来像Java中的纯多态性,可以通过两种方式实现:

  • 无论是创建每个对象的不同实现一个共同的接口

  • 定义一个抽象类按钮,并创建B,C,d按钮延伸抽象按钮并定义不同的每个按钮的行为。

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

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



文章来源: Dynamically reassign method bodies to objects