Groovy原型对象

时间:2010-02-24 04:40:22

标签: groovy metaprogramming

我有一个传入变量的方法,它代表一个脚本。

e.g。

hello.groovy

Foo.init(this)

Foo.groovy

class Foo {
    static init(app) {

    }
}

在init方法中为app变量添加大量新功能的最佳方法是什么?基本上,我想将另一个对象的所有功能添加到app对象。

例如,如果我有另一个班级:

class Bar {
    def a() { }

    def b() {

    }
}

我希望app对象基本上是new Bar()。在JavaScript中,使用原型对象很容易,但我似乎无法在groovy中使用它。完成此任务的最佳方法是什么?或者我应该做些不同的事情?

3 个答案:

答案 0 :(得分:1)

YourClass.metaClass.static.yourMethod与我在Groovy中看到的JS原型最相似。检查此链接:

Groovy meta-programming - adding static methods to Object.metaClass

干杯。

答案 1 :(得分:0)

有几种方法可以做到这一点,每种方法都有优点和缺点。在Groovy文档页面上,Dynamic Groovy部分介绍了其中的几个部分。如果我理解正确,最简单的方法是使用实​​例的metaClass添加新功能,la:

class Foo {
  static void init (a) {
    a.metaClass.a = { println "a()"; }
    a.metaClass.b = { println "b()"; } 
  }
}

def myObject = new Object();
Foo.init (myObject);

myObject.a();
myObject.b();

答案 2 :(得分:0)

最简单的方法是使用mixin。基本上你可以在app的类上调用mixin并将其传递给另一个类以将该功能合并到其中。

我修改了你的例子,以在Bar类中显示这种混合。

class Foo {
    static init(app) {
        app.class.mixin Bar
    }
}

class Bar {
    def a() { println "a called" }

    def b() {
        println "b called"
    }
}

def app = new Object()
Foo.init(app)
app.a()
app.b()

这个的输出是:

  一个叫做的人   b叫

在这种情况下,我将Bar添加到Object类,但您可以将其添加到应用程序中的任何类。