2010-03-24 10 views
28

ओवरराइडिंग जहां तक ​​मैं कह सकता हूं, स्कैला में वैल्यू (इंट), वैल्यू (स्ट्रिंग), और वैल्यू (इंट, स्ट्रिंग) के लिए गणना मूल्य वर्ग की परिभाषाएं हैं।स्केल गणना मूल्य

क्या किसी को एक अलग कन्स्ट्रक्टर का समर्थन करने के लिए एक नया मूल्य उपclass बनाने के लिए एक उदाहरण के बारे में पता है?

उदाहरण के लिए, यदि मैं मूल्य (इंट, स्ट्रिंग, स्ट्रिंग) ऑब्जेक्ट्स के साथ एक गणना बनाना चाहता हूं, तो मैं इसे कैसे करूँगा? मुझे गणना कक्षा का उपयोग करने के सभी अन्य लाभ चाहिए।

धन्यवाद।

उत्तर

40

गणना मूल्य वैल क्लास का उदाहरण हैं। इस वर्ग को बढ़ाया जा सकता है और एक फैक्ट्री विधि जोड़ा जा सकता है।

object My extends Enumeration { 
    val A = Value("name", "x") 
    val B = Value("other", "y") 
    class MyVal(name: String, val x : String) extends Val(nextId, name) 
    protected final def Value(name: String, x : String): MyVal = new MyVal(name, x) 
} 

scala> My.B.id 
res0: Int = 1 

scala> My.B.x 
res1: String = y 
+2

उत्कृष्ट:

class MyEnum(myParam:String) object MyEnum { val Value1 = new MyEnum("any parameters you want") val Value2 = new MyEnum("") object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place") } 

यहाँ आप एक अधिक जटिल उदाहरण मिल जाएगा! ठीक वैसे ही काम करता है जैसा मैं चाहता था। धन्यवाद। – Ralph

+0

@ थॉमस जंग: आपका विचार शानदार है, लेकिन मैं इसका उपयोग नहीं कर सका। एक चेतावनी थी "आयातित 'मेरा' पैकेज में ऑब्जेक्ट की परिभाषा द्वारा स्थायी रूप से छिपा हुआ है" अंत में, मैंने इस पंक्ति को जोड़ा: इस उदाहरण के लिए मेरा = मान टाइप करें और यह काम करता है। मुझे अभी भी समझ में नहीं आता क्यों, क्या आप इसे समझा सकते हैं? –

+0

'माई' गणना का उपयोग करने के लिए, आपको पहले इसे 'आयात My._'' के साथ आयात करना होगा और 'My' ऑब्जेक्ट में निम्न कोड भी जोड़ें:' मेरा = MyVal' टाइप करें, ताकि आप x val पर acces कर सकें। – metch

1

वास्तव में स्कैला गणना में जावा की तुलना में बहुत सरल अर्थ है। आपके उद्देश्य के लिए आपको किसी भी तरह से गणना और उसके मूल्य को कम करने की आवश्यकता नहीं है, आपको केवल val के रूप में अपने साथी ऑब्जेक्ट में अपने स्वयं के प्रकार को तुरंत चालू करने की आवश्यकता है। इस तरह आपको जावा में मौजूद val value:MyEnum = MyEnum.Value का परिचित एक्सेस मॉडल मिलेगा जो थॉमस जंग द्वारा प्रदान किए गए उदाहरण में संभव नहीं है। वहां आपके पास def value:My.MyVal = MyEnum.Value होगा जो समाधान की सभी हैकनेस के अलावा मुझे लगता है कि यह भ्रमित है। यहाँ मैं क्या प्रस्ताव का एक उदाहरण है: Scala Best Practices: Trait Inheritance vs Enumeration