Groovy Прототип Объект - PullRequest
       10

Groovy Прототип Объект

1 голос
/ 24 февраля 2010

У меня есть метод с входящей переменной, которая представляет собой скрипт.

например.

hello.groovy

Foo.init(this)

Foo.groovy

class Foo {
    static init(app) {

    }
}

Каков наилучший способ добавить тонну новых функций к переменной app в методе init? По сути, я хотел бы добавить все функциональные возможности другого объекта к объекту app.

Например, если бы у меня был другой класс:

class Bar {
    def a() { }

    def b() {

    }
}

Я бы хотел, чтобы объект app был в основном new Bar(). В JavaScript это легко с помощью объекта-прототипа, но я не могу заставить его работать безупречно. Каков наилучший способ сделать это? Или я должен делать что-то по-другому?

Ответы [ 3 ]

1 голос
/ 05 октября 2010

YourClass.metaClass.static.yourMethod наиболее похож на прототип JS, который я видел в Groovy. Проверьте эту ссылку:

Groovy метапрограммирование - добавление статических методов в Object.metaClass

Приветствие.

0 голосов
/ 24 февраля 2010

Самый простой способ сделать это - использовать миксин. По сути, вы можете вызвать 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()

Вывод этого будет:

называется б называется

В этом случае я добавил Bar в класс Object, но вы можете добавить его в любой класс в вашем приложении.

0 голосов
/ 24 февраля 2010

Есть несколько способов сделать это, и у каждого есть свои преимущества и недостатки. На странице документации Groovy раздел Динамический Groovy иллюстрирует некоторые из них. Если я вас правильно понимаю, самый простой способ - просто использовать метакласс экземпляра для добавления новых функций, например:

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