2011-07-15 22 views
6

मुझे आश्चर्य है कि क्या आप स्कैला में पहले से ही मौजूदा गणनाओं का विस्तार कर सकते हैं। उदाहरण के लिए:स्कैला में मौजूदा गणना वस्तुओं का विस्तार कैसे करें?

object BasicAnimal extends Enumeration{ 
    type BasicAnimal = Value 
    val Cat, Dog = Value 
} 

इस कुछ इस तरह से बढ़ाया जा सकता है:

object FourLeggedAnimal extends BasicAnimal{ 
    type FourLeggedAnimal = Value 
    val Dragon = Value 
} 

फिर, FourLeggedAnimal में तत्वों होगा बिल्ली, कुत्ते और ड्रैगन। क्या यह किया जा सकता है?

उत्तर

3

नहीं, आप यह नहीं कर सकते हैं। extends के बाद पहचानकर्ता एक प्रकार नहीं है, यह एक मूल्य है, इसलिए यह दुर्भाग्य से काम नहीं करेगा।

+0

ओह, मुझे अपने तरीकों की त्रुटि दिखाई देती है। मैंने एक नई प्रतिक्रिया जोड़ दी है, इसलिए मैं कोड को सही तरीके से लिख सकता हूं। – Henry

+0

यह प्रतिष्ठा के कारण मुझे पोस्ट नहीं करने देगा। असल में, आप वस्तुओं को सार वर्गों के रूप में परिभाषित कर सकते हैं और उन्हें बढ़ा सकते हैं, फिर उन वस्तुओं को तुरंत चालू करें जो सीधे संबंधित वर्गों का विस्तार करते हैं। – Henry

+0

यहां कोड है: http://codepaste.net/24vfhv स्पैम के लिए खेद है। – Henry

1

हो सकता है कि जिस तरह से है:

object E1 extends Enumeration { 
    type E1 = Value 
    val A, B, C = Value 
} 
class ExtEnum(srcEnum: Enumeration) extends Enumeration { 
    srcEnum.values.foreach(v => Value(v.id, v.toString)) 
} 
object E2 extends ExtEnum(E1) { 
    type E2 = Value 
    val D, E = Value 
} 
println(E2.values) // prints > E2.ValueSet(A, B, C, D, E) 

एक टिप्पणी: यह नाम से E2 से E1 मूल्यों का उपयोग करना संभव नहीं है:

E2.A // Can not resolve symbol A 

लेकिन चाहते आप उन्हें फोन कर सकते हैं:

E2(0) // A 

या:

E2.withName(E1.A.toString) // A 
+0

मुझे यह विचार पसंद है, कुल एनम के लिए है जो स्थिर प्रकार हैं, इससे कोई फर्क नहीं पड़ता कि आप उन्हें दोहराते हैं, केवल एक जटिल चीज होगी यदि आपको डेटाबेस में सहेजने के लिए आईडी का उपयोग करने की आवश्यकता है, तो आपको श्रेणियों को टालने के लिए परिभाषित करना चाहिए भ्रम पैदा करना ... –