我有一個類A的靜態閉包委託調用到B類。但是,當發出一個調用()到A靜態閉包與A實例我似乎沒有訪問A上的實例屬性不要太驚訝,因爲我正在使用靜態封閉。解決此問題的一種方法是將實例化的A設置爲閉包委託。但是,我需要類B是靜態閉包的委託。是否可以更改封閉的所有者?
是否有無論如何我可以改變靜態閉包的所有者,所以它指向實例化的A類而不是靜態?並保持B作爲代表?或者這是不可能的?
我有一個類A的靜態閉包委託調用到B類。但是,當發出一個調用()到A靜態閉包與A實例我似乎沒有訪問A上的實例屬性不要太驚訝,因爲我正在使用靜態封閉。解決此問題的一種方法是將實例化的A設置爲閉包委託。但是,我需要類B是靜態閉包的委託。是否可以更改封閉的所有者?
是否有無論如何我可以改變靜態閉包的所有者,所以它指向實例化的A類而不是靜態?並保持B作爲代表?或者這是不可能的?
你錯了......你可以更換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類。
然而在實踐中,你可能想尋找在設置爲關閉,而不是業主的委託,但如果沒有的你想達到什麼樣的例子,它是很難說這是否是你想要的
這正是我正在尋找的,但是我解決了我的問題,而無需使用更改封閉的所有者。但是,對於任何想知道是否可以更改閉包的.owner屬性的人來說,這是一個很好的迴應!謝謝! – netbrain 2011-05-03 12:38:32
答案是:這是不可能的。人不能改變封閉的所有者。
事實並非如此:fooClosure.delegate = someOtherClass。 Tim Yates在請求示例代碼中正確地演示了您正在嘗試執行的操作 - 在Groovy中實現所需功能的許多不同方法... – virtualeyes 2011-05-02 18:19:03
以及閉包。@ owner = otherInstance ... ...?可能不是可取的(因爲我認爲沒有'setOwner'方法的原因) – 2011-05-03 12:21:49
感謝您的「。@ owner =」提示。出於某種原因(我厭惡groovy和groovy/geb項目,我必須保持這種狀態,所以我儘可能少地理解原因),當使用「.delegate =」將代碼從一個類遷移到另一個類時,我是這與封閉的定義對象相同。我試過「。@ owner =」,一切都開始了。如果我當前在所述類或方法的斷點上看到多一個ClassNotFoundException或MethodNotFoundException ... arrgh! – adam 2013-03-27 19:55:14
我發現覆蓋所有人最簡單的方法是通過重新宣佈關閉的實例:
def myClosure = { return this}
def myOwnClass = new String('aa')
assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == myOwnClass
assert myClosure.getClass().newInstance(myOwnClass,myOwnClass)() == 'aa'
一個例子或兩個將真正幫助 – 2011-05-01 07:40:24