Grails

2010-06-03 16 views
6

संग्रह में ऑब्जेक्ट क्लास प्रकार का निर्धारण कैसे करें?Grails

class Human{...} 
class Man extends Human{...} 
class Women extends Human{...} 

def humans = Human.findAll() 
humans.each(){ human -> 

    // ??? , it is not work 
    if (human instanceof Man) { println "Man" } 
    if (human instanceof Woman) { println "Woman" } 
} 

धन्यवाद एक बहुत,
टॉम

+0

humanService.all() निश्चित रूप से वापस आ रहा है प्रविष्टियों? –

+0

यह ग्रेइल प्रोजेक्ट में है, मैं इसका उपयोग करता हूं> Human.findAll() –

उत्तर

15

आपके विवरण के आधार पर, मैं कहूंगा कि आप हाइबरनेट प्रॉक्सी ऑब्जेक्ट्स (यानी कक्षा का नाम है: मानव _ $$ जावासाइस्ट *) में चल रहे हैं। समाधान GORM प्रदान किए गए संस्करण का उपयोग करने के लिए होगा। लाने या किसी भिन्न विधि का उपयोग करने की आवश्यकता नहीं है।

def planet = Planet.get(1) 
planet.humans.each(){ human -> 
    if (human.instanceOf(Man)) { println "is Man"} 
    if (human.instanceOf(Woman)) { println "is Woman"} 
} 

मनुष्यों के मानव उदाहरण के बजाय मानव.instanceOf (मैन) अंतर को ध्यान दें। जावा कीवर्ड की बजाय गोरम विधि का प्रयोग करें।

आप एक संदर्भ [स्पष्टीकरण] [1] के लिए संदर्भ प्रलेखन के इस खंड को देख सकते हैं। उपधारा "लेज़ी एकल समाप्त संघों और प्रॉक्सी" देखें

[1]: http://grails.org/doc/latest/guide/single.html#5.5.2.8 उत्सुक और लेज़ी ला रहा है

4

ऐसा लगता है कि यह काम करना चाहिए।

एक जोड़े यादृच्छिक विचार: क्या आपके इंसान सही तरीके से निर्मित हैं? शायद वे वास्तव में मनुष्य या महिला के उदाहरण नहीं हैं।

आप बहुरूपता का उपयोग कर कुछ परीक्षण कर सकते हैं:

class Human{ ... 
    def speak() { println "Human" } 
} 
class Man extends Human{ ... 
    def speak() { println "Man" } 
} 
class Women extends Human{ ... 
    def speak() { println "Woman" } 
} 
def humans = humanService.all() 
humans.each(){ human -> 
    human.speak() 
} 

तो अंतिम पंक्ति प्रिंट "मानव मानव मानव", तो मनुष्य को सही ढंग से बनाया नहीं कर रहे हैं, और वे सभी मानव उदाहरणों के बजाय मनुष्य का/औरत कर रहे हैं, । यदि यह कोई त्रुटि दिखाता है, तो वे कुछ और हैं (जैसे नल या कुछ)

शुभकामनाएँ!

1

उपरोक्त कोड में कुछ भी गलत नहीं है, तो मेरा अनुमान है कि Human.findAll() एक खाली संग्रह लौटा रहा है, जो बताएगा कि क्यों कुछ भी मुद्रित नहीं किया जा रहा है। क्या आप इसके बजाय इस कोड को आजमा सकते हैं?

class Human{...} 
class Man extends Human{...} 
class Women extends Human{...} 

println "You have ${Human.findAll().size()} humans" 

यदि यह प्रिंट करता है "आपके पास 0 इंसान हैं", तो मेरा अनुमान सही है। आप Human के सभी उदाहरणों की एक सूची प्राप्त करना चाहते हैं, तो यह आपकी मदद के लिए Human.list() के बजाय Human.findAll()

+0

हाय डॉन, धन्यवाद, लेकिन मेरा संग्रह खाली नहीं है। –

0

धन्यवाद का उपयोग करने के शायद बेहतर है। मैं तुम्हारा परीक्षण करने की कोशिश करता हूँ। विधि बोलें() अपेक्षित परिणाम लौटाएं।
पुरुष लौटने के लिए "मैन" लौटा, महिला वापसी "महिला" के लिए।
आपका परीक्षण ठीक हो गया, लेकिन मेरी परेशानी हमेशा यहां होती है।
इस कोड Grails परियोजना से है:

शायद मैं और अधिक जानकारी प्राप्त भूल गया। मेरा मतलब है कि यह महत्वपूर्ण नहीं है।
वास्तव में मैं GORM कॉल का उपयोग करें:

def humans = Human.findAll() 

टॉमस

1

हाइबरनेट साथ Grails में वास्तव में instanceof के साथ समस्या है। मुझे फिर से परेशानी है।

http://community.jboss.org/wiki/ProxyVisitorPattern

मेरा मतलब है मुसीबत दिखाई देते हैं जब अपने वर्ग कुछ संबंधों है कि: मैं इस लेख पाते हैं। उदाहरण के लिए:

def planet = Planet.get(1) 
planet.humans.each(){ human -> 

    //it is not work, see the link above 
    if (human instanceof Man) { println "is Man"} 
    if (human instanceof Woman) { println "is Woman"} 
} 

टॉम

0

Grails का कौन सा संस्करण? मैंने अभी Grails 1.2.2 कंसोल में यह कोशिश की है और यह काम करता है:

new Woman(name: "Julie").save() 
new Woman(name: "Xena").save() 
new Woman(name: "Mary").save() 
new Man(name: "James").save() 
new Man(name: "Tony").save(flush: true) 

def people = Human.list() 
for (p in people) { 
    println ">> ${p.name} (${p.getClass()})" 

    if (p instanceof Man) println "It's a man" 
    if (p instanceof Woman) println "It's a woman" 
} 

शायद यह एक मुद्दा है जिसे ठीक किया गया है?

+0

हाय पीटर, मैं Grails 1.3.1 का उपयोग करता हूं। –

+0

Grails 1.3 में एक समाधान के लिए Tiggerizzy का जवाब देखें। –