2011-04-30 9 views
0

클래스 B에 대한 호출을 위임 한 클래스 A에 대한 정적 종료가 있습니다. 그러나 A 인스턴스에서 A의 정적 종료에 대한 호출()을 발행 할 때 A에 대한 인스턴스 등록 정보에 대한 액세스 권한이없는 것으로 보입니다 너무 폐쇄적 인 일을하는 메신저처럼 놀라운 일은 아닙니다. 이 문제를 해결하는 한 가지 방법은 인스턴스화 된 A를 클로저 대리자로 설정하는 것입니다. 그러나 정적 폐쇄의 대리자로 클래스 B가 필요합니다.클로저의 소유자를 변경할 수 있습니까?

정적 클로저의 소유자를 변경할 수 있으므로 정적 대신 인스턴스화 된 A 클래스를 가리킬 수 있습니까? B를 대의원으로 지켜야합니까? 아니면 불가능한가요?

+0

예 또는 두 정말 사실하지 –

답변

4

틀린 점은 ... Closure의 소유자를 변경할 수는 있지만 권장 사항은 확실하지 않습니다. 설정자가 비공개이므로 여기에는 이유가 있어야합니다. 어쨌든, 여기에 한 예가 있습니다 :

// Define a Person, with a closure to return a property 
class Person { 
    String name 
    int age 
    Closure named = { -> "returned $name" } 
} 

// Define another Class with a similar property 
class Furniture { 
    String name 
    int age 
} 

// Create our two objects 
def tim = new Person(name:'tim', age:26) 
def chair = new Furniture(name:'chair', age:3) 

// Prints 'returned tim' 
println tim.named() 

// Add the closure from tim to the chair 
chair.metaClass.named = tim.named 
// Prints 'returned tim' 
println chair.named() 

// Change the owner to the chair instance 
[email protected] = chair 
// prints 'returned chair' 
println chair.named() 
// prints 'returned chair' 
println tim.named() 

볼 수 있듯이 Person 클래스에서 Furniture 클래스로 소유자를 변경할 수 있습니다.

그러나 실제로는 소유자보다는 클로저에 대한 대리인을 설정하는 것이 좋겠지 만 달성하려는 대상의 예제가 없으면 이것이 원하는 것인지 말할 수는 없습니다

+0

이것은 정확히 내가 찾고 있던 것이지만, 폐쇄의 소유자를 변경하지 않고도 내 문제를 해결했습니다. 그러나 클로저의 .owner 속성을 변경할 수 있는지 궁금해하는 사람에게는 위대한 반응입니다. 감사! – netbrain

0

그리고 대답은 불가능합니다. 하나는 클로저의 소유자를 변경할 수 없습니다.

+1

을 도움이 될 것이다. Tim Yates는 Groovy에서 원하는 기능을 얻기위한 여러 가지 방법을 정확히 보여주기 위해 예제 코드를 요청하는 것이 옳습니다 ... – virtualeyes

+0

그리고'closure. @ owner = otherInstance'는 ...? 아마 적당하지 않을 것입니다. (이유 때문에'setOwner' 메쏘드가 없을 것 같습니다) –

+0

". @ owner ="팁을 가져 주셔서 감사합니다. 어떤 이유로 (내가 싫어하는 그루비와 groovy/geb 프로젝트는 가능한 한 원인을 이해하는 데 시간을 거의들이지 않았다.), 한 클래스에서 다른 클래스로 코드를 마이그레이션 할 때 ".delegate ="를 사용하면 작업이 중단되고 이것은 폐색이 정의 된 객체와 동일해야합니다. 나는 "@ owner ="를 시도하고 모든 것이 다시 작동하기 시작했다. 클래스 또는 메소드에서 현재 중단 점에있을 때 ClassNotFoundException 또는 MethodNotFoundException이 하나 더 표시되면 ... arrgh! – adam

0

내가 주인을 무시하는 것으로 가장 간단한 방법은 폐쇄의 인스턴스를 다시 선언하는 것입니다 : fooClosure.delegate = someOtherClass :

def myClosure = { return this} 

    def myOwnClass = new String('aa') 
    assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == myOwnClass 
    assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == 'aa' 
관련 문제