开发者

Groovy Prototype Object

I have a method with an incoming variable, which r开发者_开发问答epresents a script.

e.g.

hello.groovy

Foo.init(this)

Foo.groovy

class Foo {
    static init(app) {

    }
}

What is the best way to add a ton of new functionality to the app variable in the init method? Basically, I would like to add all the functionality of another object to the app object.

For instance, if I had another class:

class Bar {
    def a() { }

    def b() {

    }
}

I would like the app object to basically be a new Bar(). In JavaScript, this is easy by using the prototype object, but I cannot seem to get it working in groovy. What is the best way to accomplish this? Or should I be doing something differently?


YourClass.metaClass.static.yourMethod is the most similar to JS prototype I've seen in Groovy. Check this link out:

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

Cheers.


There are several ways to do this and each has advantages and disadvantages. On the Groovy Documentation page, the section on Dynamic Groovy illustrates several of these. If I understand you correctly, the simplest way is to just use the metaClass of an instance to add new functionality, a 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();


The easiest way to do this would be with a mixin. Basically you can call mixin on app's class and pass it another class to incorporate that functionality into it.

I've modified your example to show this mixing in the Bar class.

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()

The output of this would be:

a called b called

In this case I added Bar to the Object class but you could add it to any class in your application.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜