Groovy замыкание с делегированием и динамическими аргументами - PullRequest
0 голосов
/ 30 января 2019

У меня есть скрипт, в котором одно из замыканий делегирует объект другого класса.

Теперь это замыкание не должно принимать никаких параметров или нескольких параметров, а внутри кода оно должно обращаться к переданным методам делегированного объекта

предположим, что

class Foo {
   public boolean verifyName(String name);
   public boolean verifyNameAndType(String name, PersonType type);
   public boolean verifyNameAndTypeAndAge(String name, PersonType type, int age);
}

class Bar {

def getNames = { String name ->
  if (verifyName(name)){
    // do something
  }
};
def getNames = { String name, PersonType personType -> 
  if (verifyNameAndType(name, personType)) {
    // do something
  }
}
def getNames = { String name, PersonType personType, int age -> 
  if (verifyNameAndTypeAndAge(name, personType, age)) {
    // do something
  }
}

Foo foo = new Foo()
Bar bar = new Bar();
bar.delegate = foo;
Closure NAME = bar.getNames;

NAME closure is available to user where he types 
NAME('shakira');
NAME('affan', DOCTOR);
NAME('siddique', TEACHER, '45455555');

основано на параметре, оно должно вызывать определенное закрытие, но кажется, что множественное закрытие с одним и тем же именем недопустимо.

также пользователь может предоставить нулевые значения внутри параметров, но все же он будет вызывать определенныезакрытие, даже если оно равно нулю

e.g NAME('shakira', null) should call exact closure getNames(name, personType)

Я уже проверил этот URL, но моя логика не будет охватывать мою логическую часть, где пользователь предоставляет нулевые параметры внутри метода

Groovy Closure с параметрами

1 Ответ

0 голосов
/ 30 января 2019

вы не можете определить несколько переменных с одним и тем же именем в одном классе,

, однако вы можете определить несколько методов с одним именем, но с разными параметрами

, чтобы ваш код мог выглядеть следующим образом:

class Foo {
   public boolean verifyName(String name){println 'verifyName'}
   public boolean verifyNameAndType(String name, String type){println 'verifyNameAndType'}
   public boolean verifyNameAndTypeAndAge(String name, String type, int age){println 'verifyNameAndTypeAndAge'}
}

class Bar {
    @Delegate Foo delegate
    def getNames ( String name ){
        println '1'
        verifyName(name)
    }
    def getNames (String name, String personType ){ 
        println 2
        verifyNameAndType(name,personType)
    }
    def getNames (String name, String personType, int age ){ 
        println 3
        verifyNameAndTypeAndAge(name,personType,age)
    }
}
Foo foo = new Foo()
Bar bar = new Bar(delegate:foo);
Closure NAME = bar.&getNames; // &methodName returns a method closure

//NAME closure is available to user where he types 
NAME('shakira');
NAME('affan', 'DOCTOR');
NAME('siddique', 'TEACHER', 45455555);
...