एक और तरीका है का उपयोग कर metaClass
एक बंद करने और उपयोग के रूप में h()
परिभाषित करने के लिए है के बिना "बाहरी" वर्ग का संदर्भ (जो वास्तव में बाहरी वर्ग नहीं है)।
मान लें कि आप Script.groovy
फ़ाइल में अपना कोड लिख रहे हैं, यह दो वर्ग उत्पन्न करता है: C.class
और Script.class
। C
को f()
विधि पर कॉल करने का कोई तरीका नहीं है, क्योंकि इसे पता नहीं है कि यह कहां परिभाषित किया गया है।
आप कुछ विकल्प हैं:
1) @ MichaelEaster के विचार, वर्तमान क्षेत्र (यानी Script
)
2) से एक metaclass defition देने बनाएं/C
अंदर एक Script
वस्तु पारित:
def f() { "f" }
class C
{
public h(s = new Script()) { s.f() }
}
assert "f" == new C().h()
3) बनाओ ०१२३९६८०७४७एक आंतरिक वर्ग (जो भी Script
का एक उदाहरण की जरूरत है:
class Script {
def f() { "f" }
class C
{
public h() { f() }
}
static main(args) {
assert "f" == new C(new Script()).h()
}
}
4) स्टेटिक भीतरी वर्ग के साथ साथ स्थिर f()
:
class Script {
static def f() { "f" }
static class C
{
public h() { f() }
}
static main(args) {
assert "f" == new C().h()
}
}
प्लस @ dmahapatro के जवाब :-) – Will
खैर समझाया। मैं शायद ही कभी अपने फोन से यह स्पष्टीकरण दे सकता हूं, इसलिए मैंने एक आसान प्रस्ताव दिया। ;) – dmahapatro