स्केला में हर दूसरे प्रकार का उपप्रकार कुछ भी नहीं है


19

मैं स्कैला के साथ कार्यात्मक प्रोग्रामिंग पर मार्टिन ओडस्की के पाठ्यक्रम को ले रहा हूं, और अब मैंने दो चीजें सीखी हैं जो एक साथ समझ में आती हैं:

  1. स्काला मल्टीपल इनहेरिटेंस का समर्थन नहीं करता है
  2. Nothing हर दूसरे प्रकार का एक उपप्रकार है

ये दोनों कथन एक साथ नहीं रह सकते हैं, तो वास्तव में यह कैसे किया जाता है? और वास्तव में "हर दूसरे प्रकार के उपप्रकार" का क्या अर्थ है

संपादित करें 1

में स्काला एपीआई , Nothingके रूप में परिभाषित किया गया है abstract final class Nothing extends Any... तो यह अन्य वर्गों कैसे विस्तार कर सकते हैं?


यह पृष्ठ थोड़ा मदद कर सकता है: artima.com/pins1ed/scalas-hierarchy.html
jhewlett

जहां तक ​​मैं देख सकता हूं कि इसे "अंतिम विशेषता के रूप में परिभाषित किया गया है कुछ भी विस्तार नहीं करता है" scala-lang.org/api/2.7.6/scala/Nothing.html
Den

8
आप भ्रमित कर रहे हैं प्रकार और वर्ग। वे दोनों बहुत अलग चीजें हैं। दुर्भाग्य से, आप केवल एक ही नहीं हैं जो उस भेद से भ्रमित हैं, और वास्तव में दुर्भाग्य से, जो भ्रमित हैं उनमें से कुछ जावा, सी # और सी ++ जैसी लोकप्रिय भाषाओं के डिजाइनर हैं। यह नहीं कहता कि Nothingयह हर दूसरे वर्ग का उपवर्ग है। यह कहता है कि यह हर दूसरे प्रकार का एक उपप्रकार है ।
जॉर्ग डब्ल्यू मित्तग

1
@ डायलेन: जावा के इंटरफेस को सीधे स्मॉलटाक के प्रोटोकॉल से लिया गया है। स्मालटाक में, केवल प्रोटोकॉल प्रकार हैं, कक्षाएं नहीं हैं। जावा में, इंटरफेस और कक्षाएं दोनों प्रकार हैं। यह गलत है। कक्षाएं टाइप नहीं हैं, केवल इंटरफेस हैं। तथ्य यह है कि इन सभी भाषाओं में ऐसी चीजें हैं जो प्रकार हैं और कक्षाएं नहीं अप्रासंगिक हैं। समस्या यह है कि उन भाषाओं में कक्षाएं टाइप होती हैं, जो गलत है।
जॉर्ग डब्ल्यू मित्तग

1
@ JörgWMittag यह एक अलग बयान है, और बेहद तर्कपूर्ण है (मैं सहमत हूं कि यह हानिकारक है, लेकिन मैं इसे टाइपिंग की गलतफहमी के लिए नहीं कहूंगा)। यहां चर्चा करने का कोई मतलब नहीं है।

जवाबों:


27

घटाव और विरासत दो अलग-अलग चीजें हैं! सब कुछ विस्तारNothing नहीं करता है , यह एक उपप्रकार है , यह केवल विस्तारित होता है ।Any

विनिर्देश [§3.5.2] एक विशेष की subtyping-संबंध को नियंत्रित करने वाले मामले है Nothing:

§3.5.2 अनुरूपता

  • [...]
  • प्रत्येक मूल्य प्रकार के लिए
    T,scala.Nothing <: T <:scala.Any
  • हर प्रकार के निर्माता के लिए T(किसी भी प्रकार के मापदंडों के साथ)
    scala.Nothing <: T <: scala.Any
  • [...]

जहाँ <:मूल रूप से इसका अर्थ है "का एक उपप्रकार"।

जैसा कि यह कैसे किया जाता है: हम नहीं जानते, यह संकलक जादू और एक कार्यान्वयन विवरण है।

अक्सर एक भाषा चीजों को करती है जो आप प्रोग्रामर के रूप में नहीं कर सकते हैं। एक प्रतिपक्ष के रूप में Nothing: स्काला में Anyसब कुछ छोड़कर , सब कुछ विरासत में मिला है AnyAnyकुछ से विरासत क्यों नहीं है? आप ऐसा नहीं कर सकते। स्काला ऐसा क्यों कर सकता है? ठीक है, क्योंकि स्काला ने नियम तय किए हैं, न कि आपने। Nothingसब कुछ का एक उपप्रकार होना इस का एक और उदाहरण है।


10
BTW: यह nullजावा में हर प्रकार के क्षेत्र के लिए असाइन किए जाने के समान है । ऐसा क्यों संभव है? क्या nullहर वर्ग का उदाहरण है? नहीं, यह संभव है क्योंकि कंपाइलर ऐसा कहता है। अवधि।
जॉर्ग डब्ल्यू मित्तग

8
अगर मैं इसे सौ बार बढ़ा सकता हूं, तो मैं करूंगा। भ्रमित करना प्रकार और कक्षाएं सबसे बुरी चीजों में से एक है, जैसे कि जावा ने हमारे ऊपर लाया है।
जॉर्ग डब्ल्यू मित्तग

1
वंशानुक्रम और उपप्रकारों के बीच अंतर के बारे में जिज्ञासु आत्माओं के लिए cmi.ac.in/~madhavan/courses/pl2006/lecturenotes/lecture-notes/… फिर भी मैं इसे नहीं खरीदता हूं - यदि आप विरासत में मिलते हैं (जैसे extendsजावा, और रचना के रूप में नहीं ) आप इसे सब के बाद सबटाइप करने के लिए करते हैं।
ग्रीनल्डमैन

11

जब वह कहता है कि स्काला कई विरासतों का समर्थन नहीं करता है, तो वह कई बार एक विधि कार्यान्वयन को विरासत में संदर्भित करता है। बेशक, आप एक वर्ग में कई इंटरफेस / लक्षण लागू कर सकते हैं, और वे एक ही विधि को परिभाषित भी कर सकते हैं, लेकिन आपको विशेषता रेखीयकरण के कारण अलग-अलग कार्यान्वयन के बीच संघर्ष नहीं मिलता है।

सामान्य तौर पर, यदि आपके पास एक C1विधि के साथ एक वर्ग है और एक विधि के साथ एक f()वर्ग C2भी है f(), तो एकाधिक उत्तराधिकार का मतलब है कि आप किसी भी तरह दोनों कार्यान्वयनों को प्राप्त कर सकते हैंf() । यह विभिन्न समस्याओं को जन्म दे सकता है, जो स्काला केवल एक ही वर्ग से और कई लक्षणों के मामले में आपको आदेश के आधार पर एक क्रियान्वयन का चयन करके देता है।

जैसा कि Nothingचीजें वास्तव में सरल हैं, क्योंकि किसी भी चीज की कोई विशेषता या विधियां परिभाषित नहीं हैं। तो आप किसी भी विरासत संघर्ष नहीं कर सकते। लेकिन मैं यह मानता हूं कि आपका अधिकांश आश्चर्य एकाधिक उत्तराधिकार की एक अलग समझ से आता है।

एक बार जब आप समझते हैं कि विशेषता linearization प्रभावी ढंग से विरासत का कोई अस्पष्टता समाप्त, और है कि हम के रूप में कई लक्षण से प्राप्ति के लिए उल्लेख नहीं है एकाधिक वंशानुक्रम के कारण है, तो आप ठीक होना चाहिए।

यह कैसे पता चलता है: संकलक अंततः इसके लिए जिम्मेदार है। देखें स्काला भाषा विनिर्देश खंड 3.5.2 अनुरूपता, जो अन्य संपत्तियों के बीच में शामिल हैं:

For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.

या दूसरे शब्दों में, यदि आप एक कंपाइलर को सही तरीके से लागू करना चाहते हैं, तो उसे Nothingविनिर्देशन द्वारा सब कुछ के उपप्रकार के रूप में संभालना है । स्पष्ट कारणों के लिए, Nothingसिस्टम में लोड सभी वर्गों से विस्तार करने के लिए परिभाषित नहीं किया गया है, लेकिन सबटाइप के Nothingरूप में परिभाषित करने की प्रासंगिकता सभी स्थानों तक सीमित है, जहां सबटिपिंग प्रासंगिक है।

यहां एक महत्वपूर्ण बिंदु यह है कि किसी प्रकार का कोई उदाहरण मौजूद नहीं है Nothing, इसलिए, इसका उपचार सख्ती से टाइप-चेकिंग तक सीमित है, जो संकलक के दायरे में है।


2
मुझे अभी भी समझ में नहीं आया है कि यह कैसे किया जाता है ... मेरे सवाल का संपादन देखें
vainolo

1
"सबटाइप के रूप में कुछ भी परिभाषित करने की प्रासंगिकता सभी स्थानों तक सीमित नहीं है, जहां सबटाइपिंग प्रासंगिक है।" आप उस के साथ क्या संदेश देना चाहते हैं? X प्रासंगिक है जहाँ X प्रासंगिक है?
प्रेत ० मी ०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.