2010-10-13 15 views
7

मैं छोटा करने के लिए एक प्रकार उर्फ ​​लिखने के लिए करना चाहते हैं सहित उर्फ, अच्छा और स्काला कोड समझाया। मान लीजिए मुझे कुछ संग्रह मिला है जिसमें मानचित्रों की सूची होने की संपत्ति है, जिसका मूल्य tuples हैं। मेरा प्रकार List[Map[Int, (String, String)]] जैसा कुछ लिखता है, या मेरे आवेदन के रूप में कुछ भी सामान्य है। मैं कल्पना कर सकता था कि सब्सट्रिप Seq[MapLike[Int, Any]] या जो भी मेरी नाव तैरता है, कंक्रीट सबक्लास अधिक विशिष्ट होने के साथ पूछता है।स्काला प्रकार साथी वस्तु [शुरुआत]

मैं तो इस लंबी प्रकार के लिए एक उपनाम लिखना चाहते हैं चाहते हैं।

class ConcreteClass { 
    type DataType = List[Map[Int, (String, String)]] 
    ... 
} 

मैं तो खुशी से ConcreteClass#DataType का उपयोग हर जगह मैं एक ले जा सकते हैं, और यह प्रयोग करेंगे।

अब मैं एक समारोह

def foo(a : DataType) { ... } 

जोड़ने लगता है और मैं इसे बाहर से कॉल करने के लिए एक रिक्त सूची से चाहते हैं। मैं foo(List()) कॉल कर सकते हैं, लेकिन जब मैं Seq का एक और प्रकार होने के लिए मेरी अंतर्निहित प्रकार परिवर्तित करना चाहते, मैं वापस लौटने और इस कोड भी बदलना होगा। इसके अलावा, यह स्पष्ट नहीं है कि यह खाली सूची DataType के रूप में है। और साथी ऑब्जेक्ट में List विधियां नहीं हैं, इसलिए मैं DataType(), या DataType.empty पर कॉल नहीं कर सकता। जब मुझे गैर-खाली सूचियों की आवश्यकता होती है तो यह और भी परेशान होने वाला है क्योंकि मुझे इस लंबे प्रकार का एक महत्वपूर्ण हिस्सा लिखना होगा।

वहाँ किसी भी तरह से मैं स्काला पूछ सकते हैं एक ही बात के रूप में मेरे प्रकार, इसके निर्माता के तरीकों के साथ साथी वस्तु सहित समझने के लिए कोड को छोटा करने और यह blackboxing के हित में, है? या, किसी भी कारण से मुझे इसे पहले स्थान पर क्यों नहीं करना चाहिए?

उत्तर

7

जवाब वास्तव में काफी आसान था:

class ConcreteClass { 
    type DataType = List[String] 
} 
object ConcreteClass { 
    val DataType = List 
} 
val d = ConcreteClass.DataType.empty 

यह सूची और कम प्रयास में सभी तरीकों के साथ सूची के निर्माण के लिए ConcreteClass.DataType कॉल करने के लिए मेरे कोड सक्षम बनाता है।

धन्यवाद जानकारी के लिए ओलेग के लिए बहुत कुछ। यदि आप ConcreteClass.DataType को किसी भी कॉल को सूचीबद्ध करने के लिए प्रतिनिधि नहीं देना चाहते हैं, तो उसका उत्तर भी सबसे अच्छा है, लेकिन कॉलर्स को ऐसा करने की अनुमति देना ठीक से नियंत्रित करें।

+2

आप 'ConcreteClass' की उपवर्गों का इरादा नहीं है, तो' ओवरराइड करने के लिए DataType', तो आप बेहतर हो सकता है (साथी वस्तु में दोनों 'type' और' val' उपनाम डाल बजाय कक्षा में एक होने के)। इस प्रकार 'स्कैला' पैकेज ऑब्जेक्ट में उपनाम कैसे काम करते हैं। –

+0

आप वास्तव में बहुत सही हैं। मैं अब से यह करूँगा। धन्यवाद। – Jean

+1

डी को छोड़कर सूची सूची [कुछ भी नहीं] – sourcedelica

5

इसके बारे में क्या?

 
class ConcreteClass { 
    type DataType = List[String] 
} 
object DataType { 
    def apply(): ConcreteClass#DataType = Nil 
} 
//... 
val a = DataType() 

+0

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

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