के साथ संग्रह के लिए स्कैला में न्यूनतम ढांचा, मान लीजिए कि कोई उपन्यास जेनेरिक क्लास, Novel[A]
बनाना चाहता है। इस कक्षा में बहुत सारी उपयोगी विधियां होंगी - शायद यह एक प्रकार का संग्रह है - और इसलिए आप इसे उपclass करना चाहते हैं। लेकिन आप विधियों को उप-वर्ग के प्रकार को वापस करने के लिए चाहते हैं, मूल प्रकार नहीं। स्कैला 2.8 में, कम से कम काम करने के लिए क्या करना है ताकि उस वर्ग के तरीके प्रासंगिक उपclass वापस कर सकें, मूल नहीं? उदाहरण के लिए,विरासत वापसी प्रकार
class Novel[A] /* What goes here? */ {
/* Must you have stuff here? */
def reverse/* What goes here instead of :Novel[A]? */ = //...
def revrev/*?*/ = reverse.reverse
}
class ShortStory[A] extends Novel[A] /* What goes here? */ {
override def reverse: /*?*/ = //...
}
val ss = new ShortStory[String]
val ss2 = ss.revrev // Type had better be ShortStory[String], not Novel[String]
अगर आप चाहते हैं Novel
covariant जा करने के लिए इस कम से कम राशि परिवर्तन करता है?
(2.8 संग्रह अन्य चीजों के साथ ऐसा करते हैं, लेकिन वे वापसी के प्रकारों के साथ अधिक फैंसी (और उपयोगी) तरीकों से भी खेलते हैं - सवाल यह है कि अगर कोई इस उपप्रकार को हमेशा चाहता है तो कितना छोटा ढांचा दूर हो सकता है -ट्रर्न-उपप्रकार सुविधा।)
संपादित करें: reverse
से ऊपर दिए गए कोड में मान लें एक प्रतिलिपि बनाता है। यदि कोई स्थान परिवर्तन करता है और फिर स्वयं को लौटाता है, तो कोई this.type
का उपयोग कर सकता है, लेकिन यह काम नहीं करता है क्योंकि प्रति this
नहीं है।
अर्जन एक और सवाल है कि निम्नलिखित समाधान का सुझाव से जुड़ा हुआ:
def reverse: this.type = {
/*creation of new object*/.asInstanceOf[this.type]
}
जो मूल रूप से क्रम में प्रकार व्यवस्था करने के लिए निहित है कि हम क्या चाहते हैं। लेकिन यह वास्तव में एक समाधान नहीं है, क्योंकि अब हमने टाइप सिस्टम से झूठ बोला है, संकलक यह सुनिश्चित करने में हमारी सहायता नहीं कर सकता है कि हम वास्तव में को ShortStory
प्राप्त करें जब हमें लगता है कि हम करते हैं। (उदाहरण के लिए, हमें कंपाइलर को खुश करने के लिए ऊपर दिए गए उदाहरण में reverse
को ओवरराइड करना नहीं होगा, लेकिन हमारे प्रकार हम जो चाहते थे वह नहीं होंगे।)
शायद आपको स्काला के सिंगलटन प्रकारों का मतलब यह नहीं था कि आपके मन में न्यूनतम ढांचे का उदाहरण है, मुझे लगता है? किसी भी मामले में, उदाहरण के लिए ऑनलाइन उदाहरणों का उपयोग कैसे किया जा सकता है http://scalada.blogspot.com/2008/02/thistype-for-chaining-method-calls.html पर पाया जा सकता है। एसओ पर एक उदाहरण भी है जो दिखाता है कि कुछ हैकरी के साथ अपरिवर्तनीय कक्षाएं कैसे बनाई जा सकती हैं http://stackoverflow.com/questions/775312/why-cannot-this-type-be-used-for-new-instances –
@ अरजन - मेरा मतलब यह नहीं था, क्योंकि यह बहुत सीमित है। (उदाहरण के लिए कॉपी विधियों को प्रतिबंधित किया गया है।) –