मुझे रोलाण्ड एवल्ड का उत्तर पसंद आया क्योंकि उन्होंने टाइप एलीस के एक बहुत ही सरल उपयोग के मामले के साथ वर्णन किया, और अधिक विवरण के लिए एक बहुत अच्छा ट्यूटोरियल पेश किया। हालाँकि, इस प्रकार के सदस्यों के नाम वाली पोस्ट में एक और उपयोग का मामला पेश किया गया है , मैं इसके सबसे व्यावहारिक उपयोग के मामले का उल्लेख करना चाहूंगा, जो मुझे बहुत पसंद आया: (यह हिस्सा यहाँ से लिया गया है :)
सार प्रकार:
type T
टी ऊपर कहते हैं कि इस प्रकार का उपयोग होने वाला है, अभी तक अज्ञात है, और कंक्रीट उपवर्ग के आधार पर, इसे परिभाषित किया जाएगा। प्रोग्रामिंग अवधारणाओं को समझने के लिए हमेशा सबसे अच्छा तरीका एक उदाहरण प्रदान कर रहा है: मान लीजिए कि आपके पास निम्नलिखित परिदृश्य हैं:
यहां आपको संकलन त्रुटि मिलेगी, क्योंकि कक्षाओं में खाने की विधि गाय और बाघ वर्ग पशु में खाने की विधि को ओवरराइड नहीं करते हैं, क्योंकि उनके पैरामीटर प्रकार अलग हैं। यह क्लास काउ में ग्रास है, और क्लास में मीट बनाम टाइगर बनाम फूड इन क्लास एनिमल जो कि सुपर क्लास है और सभी सबक्लास को कंफर्म होना चाहिए।
अब एब्स्ट्रैक्शन टाइप करने के लिए, निम्न डायग्राम द्वारा और केवल एक एब्सट्रैक्शन जोड़कर, आप इनपुट के प्रकार को परिभाषित कर सकते हैं, उपवर्ग के अनुसार।
अब निम्नलिखित कोड देखें:
val cow1: Cow = new Cow
val cow2: Cow = new Cow
cow1 eat new cow1.SuitableFood
cow2 eat new cow1.SuitableFood
val tiger: Tiger = new Tiger
cow1 eat new tiger.SuitableFood // Compiler error
कंपाइलर खुश है और हम अपने डिजाइन में सुधार करते हैं। हम अपनी गाय को गाय के साथ भोजन कर सकते हैं। अच्छा भोजन और संकलक हमें भोजन के साथ गाय को खिलाने से रोकता है जो टाइगर के लिए उपयुक्त है। लेकिन क्या होगा अगर हम गाय 1 उपयुक्तफूड और गाय 2 सूटेबेफूड के प्रकार के बीच अंतर करना चाहते हैं। दूसरे शब्दों में, कुछ परिदृश्यों में यह बहुत उपयोगी होगा यदि हम जिस मार्ग तक पहुँचते हैं (निश्चित रूप से वस्तु के माध्यम से) मूल रूप से बात करते हैं। स्काला में उन्नत सुविधाओं के लिए धन्यवाद, यह संभव है:
पथ-निर्भर प्रकार:
स्केल ऑब्जेक्ट में सदस्य के रूप में प्रकार हो सकते हैं। प्रकार का अर्थ, उस पथ पर निर्भर करता है जिसे आप इसे एक्सेस करने के लिए उपयोग करते हैं। पथ एक ऑब्जेक्ट (उर्फ एक वर्ग का एक उदाहरण) के संदर्भ से निर्धारित होता है। इस परिदृश्य को लागू करने के लिए, आपको गाय के अंदर वर्ग घास को परिभाषित करने की आवश्यकता है, अर्थात, गाय बाहरी वर्ग है और घास आंतरिक वर्ग है। संरचना इस प्रकार होगी:
class Cow extends Animal {
class Grass extends Food
type SuitableFood = Grass
override def eat(food: this.SuitableFood): Unit = {}
}
class Tiger extends Animal {
class Meat extends Food
type SuitableFood = Meat
override def eat(food: this.SuitableFood): Unit = {}
}
अब यदि आप इस कोड को संकलित करने का प्रयास करते हैं:
1. val cow1: Cow = new Cow
2. val cow2: Cow = new Cow
3. cow1 eat new cow1.SuitableFood
4. cow2 eat new cow1.SuitableFood // compilation error
लाइन 4 पर आपको एक त्रुटि दिखाई देगी क्योंकि ग्रास अब गाय का एक आंतरिक वर्ग है, इसलिए ग्रास का एक उदाहरण बनाने के लिए, हमें एक गाय ऑब्जेक्ट की आवश्यकता है और यह गाय ऑब्जेक्ट पथ निर्धारित करता है। तो 2 गाय वस्तुएं 2 अलग-अलग मार्ग को जन्म देती हैं। इस परिदृश्य में, काउ 2 केवल विशेष रूप से इसके लिए बनाए गए भोजन को खाना चाहता है। इसलिए:
cow2 eat new cow2.SuitableFood
अब हर कोई खुश है :-)