2011-04-30 22 views
0

我有一個類A的靜態閉包委託調用到B類。但是,當發出一個調用()到A靜態閉包與A實例我似乎沒有訪問A上的實例屬性不要太驚訝,因爲我正在使用靜態封閉。解決此問題的一種方法是將實例化的A設置爲閉包委託。但是,我需要類B是靜態閉包的委託。是否可以更改封閉的所有者?

是否有無論如何我可以改變靜態閉包的所有者,所以它指向實例化的A類而不是靜態?並保持B作爲代表?或者這是不可能的?

+0

一個例子或兩個將真正幫助 – 2011-05-01 07:40:24

回答

4

你錯了......你可以更換Closure的擁有者,但它是多麼明智,我不知道(因爲setter是私人的,這一定是有原因的)。無論如何,這裏是一個例子:

// 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 2011-05-03 12:38:32

0

答案是:這是不可能的。人不能改變封閉的所有者。

+1

事實並非如此:fooClosure.delegate = someOtherClass。 Tim Yates在請求示例代碼中正確地演示了您正在嘗試執行的操作 - 在Groovy中實現所需功能的許多不同方法... – virtualeyes 2011-05-02 18:19:03

+0

以及閉包。@ owner = otherInstance ... ...?可能不是可取的(因爲我認爲沒有'setOwner'方法的原因) – 2011-05-03 12:21:49

+0

感謝您的「。@ owner =」提示。出於某種原因(我厭惡groovy和groovy/geb項目,我必須保持這種狀態,所以我儘可能少地理解原因),當使用「.delegate =」將代碼從一個類遷移到另一個類時,我是這與封閉的定義對象相同。我試過「。@ owner =」,一切都開始了。如果我當前在所述類或方法的斷點上看到多一個ClassNotFoundException或MethodNotFoundException ... arrgh! – adam 2013-03-27 19:55:14

0

我發現覆蓋所有人最簡單的方法是通過重新宣佈關閉的實例:

def myClosure = { return this} 

    def myOwnClass = new String('aa') 
    assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == myOwnClass 
    assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == 'aa' 
相關問題