2017-02-17 2 views
0

На данный момент у меня есть следующий код:Как создать имена методов динамически в заводной

class SampleFixture { 

    static aFixtureWithCodeAA() { 
     fixtureAA() 
    } 

    static aFixtureWithCodeBB() { 
     fixtureBB() 
    } 

    static aFixtureWithCodeCC() { 
     fixtureCC() 
    } 
} 

я хотел бы, чтобы превратить это в нечто вроде

class SampleFixture { 

    static aFixture(code) { 
     fixture[code]() 
    } 
} 

У меня есть еще один класс, где fixtureAA , fixtureBB и fixtureCC. Таким образом, значения кода предопределены. Я хочу, чтобы метод fixture [code] был создан во время выполнения, а не для метода для каждого отдельного прибора.

Как я могу это сделать?

EDIT: Я читал это http://groovy-lang.org/metaprogramming.html#_dynamic_method_names, и похоже, что я хочу делать, но я не могу заставить его работать.

Чтобы уточнить: прочитав эту статью, я хотел бы получить метод с именем baseName + varSufix, как в «fixture $ {code}»(). В идеале я бы в конечном итоге с чем-то вроде:

class SampleFixture { 

    static aFixture(code) { 
     MyClass."fixture{code}"() 
    } 
} 

Так что я бы другое имя метода в зависимости от кода я передаю.

ответ

0

Вы можете реализовать метод, называемый invokeMethod(String method, args) и разобрать код из method аргумента:

class SampleFixture { 

    def fixture = [ 
     AA: { "code aa" }, 
     BB: { "code bb" }, 
     CC: { "code cc" }, 
    ] 

    def invokeMethod(String method, args) { 
     def code = method - "aFixtureWithCode" 
     fixture[code]() 
    } 
} 


f = new SampleFixture() 

assert f.aFixtureWithCodeAA() == "code aa" 
assert f.aFixtureWithCodeBB() == "code bb" 
assert f.aFixtureWithCodeCC() == "code cc" 

UPDATE: вот решение с использованием второго класса для перенаправления вызова метода к другому классу

class Fixture { 
    def fixtureAA() { "code aa" } 
    def fixtureBB() { "code bb" } 
    def fixtureCC() { "code cc" } 
} 

class SampleFixture {} 

SampleFixture.metaClass.static.invokeMethod = { String method, args -> 
    def code = method - "aFixtureWithCode" 
    new Fixture()."fixture${code}"() 
} 


assert SampleFixture.aFixtureWithCodeAA() == "code aa" 
assert SampleFixture.aFixtureWithCodeBB() == "code bb" 
assert SampleFixture.aFixtureWithCodeCC() == "code cc" 
1

Вы имели в виду:

class MyClass { 
    static fixtureAA() { "oooh, aa" } 
    static fixtureBB() { "cool, bb" } 
    static fixtureCC() { "wow, cc" } 
} 

class MyFixture { 
    def call(code) { 
     MyClass."fixture$code"() 
    } 
} 

println new MyFixture().call('BB') 

(вы были так близко)

Или вы могли бы сделать что-то вроде:

class MyClass { 
    static fixtureAA() { "oooh, aa" } 
    static fixtureBB() { "cool, bb" } 
    static fixtureCC() { "wow, cc" } 
} 

class MyFixture { 
    def methodMissing(String name, args) { 
     try { 
      MyClass."fixture$name"() 
     } 
     catch(e) { 
      "No idea how to $name" 
     } 
    } 
} 

assert "oooh, aa" == new MyFixture().AA() 
assert "cool, bb" == new MyFixture().BB() 
assert "wow, cc" == new MyFixture().CC() 
assert "No idea how to DD" == new MyFixture().DD() 
+0

Это именно то, что я искал. Это сработало. TY! –

Смежные вопросы