2010-05-11 21 views
5

और अधिक सटीक उदाहरण:निर्दिष्ट कक्षा में मिश्रित गुणों की सूची कैसे प्राप्त करें?

abstract trait A 
trait B extends A 
trait C extends A 

क्या लक्षण है कि विस्तार विशेषता ए (यह कई लोगों के लिए 0 से हो सकता है) निर्दिष्ट कक्षा में मिलाया गया कैसे की जाँच करने के?

उत्तर

3

कैसे अन्य उत्तर की एक संकर

abstract trait A //interested in this one 
trait B extends A //and this one 
trait C extends A //this one too 
trait D //don't care about this one though 

val x = new A with B with D 
x.getClass.getInterfaces.filter(classOf[A].isAssignableFrom(_)) 

रिटर्न

Array[java.lang.Class[_]] = Array(interface A, interface B) 
1
scala> val x = new A with B with C 
x: java.lang.Object with A with B with C = [email protected] 

scala> x.getClass.getInterfaces 
res11: Array[java.lang.Class[_]] = Array(interface A, interface B, interface C) 
+0

के बारे में मैं इस स्पष्ट विधि के बारे में सोचा था, लेकिन यहाँ पूछने के लिए क्योंकि लक्षण के रूप में मैं परिष्कृत तरीके में संकलन कर सकते हैं का फैसला किया। – Jeriho

+0

भाषा सुविधाओं के पर्याप्त होने पर प्रतिबिंब का उपयोग करने का कभी भी सहारा लें। –

+0

सहमत हुए। मैंने पहली बार इंस्टेंसऑफ का उपयोग किया - जिसने अपने प्रश्न के शरीर को जवाब दिया। लेकिन जब मैंने अपने वास्तविक प्रश्न शीर्षक "गुणों की सूची कैसे प्राप्त करें ..." को फिर से पढ़ा, तो मैंने इंटरफेस प्राप्त करने के लिए स्विच किया। –

1

कैसे कुछ इस तरह के बारे में:

def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = { 
    clazz.getInterfaces().filter { baseTrait isAssignableFrom _ } 
} 

यह सभी लक्षण पता चलता है कि clazz लागू करता है कि खुद को baseTrait की subtraits हैं। निम्नलिखित लक्षण के साथ:

trait A 
trait B extends A 
trait C extends A 
trait D 

उपयोग इस प्रकार है:

scala> val x1 = new C with B 
x1: java.lang.Object with C with B = [email protected] 

scala> getTraitsExtending(x1.getClass, classOf[A]) 
res0: Seq[Class[_]] = WrappedArray(interface C, interface B) 

scala> val x2 = new C with A    
x2: java.lang.Object with C with A = [email protected] 

scala> getTraitsExtending(x2.getClass, classOf[A]) 
res1: Seq[Class[_]] = WrappedArray(interface C, interface A) 

scala> val x3 = new C with D    
x3: java.lang.Object with C with D = [email protected] 

scala> getTraitsExtending(x3.getClass, classOf[A]) 
res3: Seq[Class[_]] = WrappedArray(interface C) 

यह केवल इंटरफेस कि सीधे उदाहरण में पारित के वर्ग द्वारा कार्यान्वित किया जाता पर लग रहा है, लेकिन रिकर्सिवली देखने के लिए बढ़ाया जा सकता है विरासत पदानुक्रम ऊपर।

+0

यह मेरे उत्तर की तरह एक भयानक लग रहा है + बॉयलरप्लेट का थोड़ा सा :) –

+0

@ केविन - डेट टिकटों का कहना है कि आपका उत्तर एक उत्तर दिखता है मेरे जवाब की तरह बहुत भयानक ... :-P –

+0

यह तब नहीं है जब मैं "नवीनतम" द्वारा आदेश देता हूं :) –

संबंधित मुद्दे