【问题标题】:Dynamically reassign method bodies to objects动态地将方法体重新分配给对象
【发布时间】:2012-06-06 16:13:39
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: java class dynamic methods overriding


【解决方案1】:

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

您需要创建一个 classinterface,称为 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
    }
});

【讨论】:

  • 所以答案是“不,它没有”
  • @NikitaBeloglazov,在某种意义上是的。但解决方法很简单。
【解决方案2】:

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

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

【讨论】:

  • 是的!正是我需要的,谢谢!只需等待 10 分钟即可接受您的回答 :)
  • 创建该类的 3 个实例,[...] 那么我可以为每个对象的渲染方法分配主体吗? -- 请注意,在此解决方案中,您创建对象后不要重新分配方法。
【解决方案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
  }
};

【讨论】:

  • 你的意思是我可以做 Class obj = new Class() {public void function() {}}; ?
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    如果你只想实例化一个具有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   
        }
    }
    

    【讨论】:

      【解决方案6】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2015-08-20
        • 2012-07-13
        • 2010-12-29
        • 1970-01-01
        相关资源
        最近更新 更多