class Box {
Closure click
Box() {
click = {}
}
void onClick() {
click()
}
}
class TextBox extends Box {
List<String> content
TextBox (String[] a) {
super()
content = a
}
}
class Main {
public static void main(String[] args) {
Main m = new Main()
}
Main() {
String[] a = ["Hello world!"]
Box b = new TextBox(a)
b.click = {content.add("You clicked this box!")}
b.onClick() //throws Exception
}
}
(以上內容,很明顯,簡化;在現實中,這些類是更復雜一點,和的onClick()的調用是由於在JFrame點擊)如何獲取Groovy中從中調用閉包的類(範圍)?
現在,當我嘗試運行Main.main()),我得到一個異常: 線程「AWT-EventQueue-0」中的異常groovy.lang.MissingPropertyException:沒有這樣的屬性:內容類:主要
顯然,出於某種原因,它在Main中搜索列表,而不是在TextBox或Box中,從中調用它。我也嘗試過使用這個,所有者和代表,但他們都指向Main。 我設法把它給予這個作爲參數的工作:
...
void onClick() {
click(this)
}
...
b.click = {it.content.add("You clicked this box!")}
看來,然而,奇怪的實際需要通過「本」,以將閉合它能夠知道它被稱爲只是從。沒有更優雅的解決方案嗎?另外,即使進入TextBox範圍確實不可能,是否有可能進入Box範圍?
嗯,好的。這確實比使用「它」更優雅。雖然我仍然需要通過「this」(click.delegate = this),但是我認爲如果不這樣做,那就是不可能的。非常感謝! – Callid
Yw。如果你沒有正確地設置委託,這是不可能的,這就是封閉性質。此外,我們沒有通過任何關閉,我們正在設置其代表財產。 :)(堅持封閉使用父代替被調用者)。 – dmahapatro