यह शायद एक प्रकार और वर्ग के बीच अंतर करने के लिए पहले उपयोगी है और फिर उप-उप और उपवर्ग के बीच के अंतर में गोता लगाएँ।
इस उत्तर के बाकी हिस्सों के लिए मैं यह मानने जा रहा हूं कि चर्चा के प्रकार स्थिर प्रकार हैं (क्योंकि आमतौर पर सबटिप करने के बाद एक स्थिर संदर्भ में आता है)।
मैं एक प्रकार और वर्ग के बीच के अंतर को स्पष्ट करने में मदद करने के लिए एक खिलौना स्यूडोकोड विकसित करने जा रहा हूं क्योंकि अधिकांश भाषाएं उन्हें कम से कम भाग में (अच्छे कारण के लिए बताती हैं कि मैं संक्षेप में स्पर्श करूंगा)।
एक प्रकार से शुरू करते हैं। एक प्रकार आपके कोड में एक अभिव्यक्ति के लिए एक लेबल है। इस लेबल का मान और क्या यह सुसंगत है (कुछ प्रकार के सिस्टम-विशिष्ट की संगत परिभाषा के लिए) अन्य सभी लेबल के मूल्य को आपके प्रोग्राम को चलाने के बिना किसी बाहरी प्रोग्राम (एक टाइपकैचर) द्वारा निर्धारित किया जा सकता है। यही कारण है कि इन लेबल को विशेष और अपने नाम के योग्य बनाता है।
हमारी खिलौना भाषा में हम जैसे लेबल के निर्माण की अनुमति दे सकते हैं।
declare type Int
declare type String
तब हम इस प्रकार के होने के नाते विभिन्न मूल्यों को लेबल कर सकते हैं।
0 is of type Int
1 is of type Int
-1 is of type Int
...
"" is of type String
"a" is of type String
"b" is of type String
...
इन कथनों के साथ हमारा टाइपराइटर अब इस तरह के कथनों को अस्वीकार कर सकता है
0 is of type String
यदि हमारी प्रकार प्रणाली की आवश्यकताओं में से एक यह है कि प्रत्येक अभिव्यक्ति का एक अनूठा प्रकार है।
आइए अब इस बात को छोड़ दें कि यह कितना क्लिंकी है और आप किस तरह से कई प्रकार के एक्सप्रेशन टाइप करने में समस्याएँ आने वाले हैं। हम बाद में इसमें वापस आ सकते हैं।
दूसरी ओर एक वर्ग विधियों और क्षेत्रों का एक संग्रह है जो एक साथ समूहीकृत होते हैं (संभवतः निजी या सार्वजनिक जैसे एक्सेस संशोधक के साथ)।
class StringClass:
defMethod concatenate(otherString): ...
defField size: ...
इस वर्ग का एक उदाहरण इन विधियों और क्षेत्रों की या तो परिभाषा बनाने या उपयोग करने की क्षमता प्राप्त करता है।
हम एक वर्ग को इस प्रकार से संबद्ध करने का विकल्प चुन सकते हैं कि किसी वर्ग का प्रत्येक उदाहरण स्वचालित रूप से उस प्रकार के साथ लेबल हो।
associate StringClass with String
लेकिन हर प्रकार के एक संबद्ध वर्ग की आवश्यकता नहीं है।
# Hmm... Doesn't look like there's a class for Int
यह भी बोधगम्य है कि हमारी खिलौना भाषा में हर वर्ग का एक प्रकार नहीं है, खासकर यदि हमारे सभी भावों के प्रकार नहीं हैं। यह कल्पना करना थोड़ा मुश्किल (लेकिन असंभव नहीं) है कि किस प्रकार की प्रणाली की स्थिरता के नियम ऐसे दिखेंगे जैसे कि कुछ भावों के प्रकार और कुछ नहीं थे।
इसके अलावा हमारी खिलौना भाषा में इन संघों को अद्वितीय होने की आवश्यकता नहीं है। हम दो वर्गों को एक ही प्रकार से जोड़ सकते हैं।
associate MyCustomStringClass with String
अब ध्यान रखें कि अभिव्यक्ति के मूल्य को ट्रैक करने के लिए हमारे टाइपटेकर के लिए कोई आवश्यकता नहीं है (और ज्यादातर मामलों में ऐसा नहीं होगा या ऐसा करना असंभव है)। यह सभी जानते हैं कि आपके द्वारा बताए गए लेबल हैं। एक अनुस्मारक के रूप में पहले टाइपकेचर केवल 0 is of type Stringहमारे कृत्रिम रूप से बनाए गए नियम के कारण कथन को अस्वीकार करने में सक्षम था, जिसमें अभिव्यक्ति के अद्वितीय प्रकार होने चाहिए और हमने पहले से ही अभिव्यक्ति को 0कुछ और लेबल किया था । इसके मूल्य का कोई विशेष ज्ञान नहीं था 0।
तो क्या घटाव के बारे में? खैर उप-प्रकार टाइपिंग में एक सामान्य नियम का एक नाम है जो आपके अन्य नियमों को शिथिल करता है। अर्थात् यदि A is subtype of Bतब हर जगह आपका टाइपराइटर एक लेबल की मांग करता है B, तो यह भी स्वीकार करेगा A।
उदाहरण के लिए हम अपने नंबर के लिए निम्नलिखित कर सकते हैं बजाय इसके कि हम पहले क्या थे।
declare type NaturalNum
declare type Int
NaturalNum is subtype of Int
0 is of type NaturalNum
1 is of type NaturalNum
-1 is of type Int
...
उपवर्ग एक नए वर्ग की घोषणा करने के लिए एक शॉर्टहैंड है जो आपको पहले घोषित तरीकों और क्षेत्रों का पुन: उपयोग करने की अनुमति देता है।
class ExtendedStringClass is subclass of StringClass:
# We get concatenate and size for free!
def addQuestionMark: ...
हम के सहयोगी उदाहरणों की जरूरत नहीं है ExtendedStringClassके साथ Stringकी तरह हम साथ किया था StringClass, के बाद से सभी के बाद यह एक नया वर्ग है, हम बस जितना लिखने के लिए नहीं था। यह हमें ExtendedStringClassएक प्रकार देने की अनुमति देता है जो कि Stringटाइपराइटर के दृष्टिकोण से असंगत है ।
इसी तरह हम एक पूरी नई क्लास बनाने NewClassऔर करने का फैसला कर सकते थे
associate NewClass with String
अब हर उदाहरण को टाइपराइटर के दृष्टिकोण से StringClassप्रतिस्थापित किया जा सकता है NewClass।
इसलिए सिद्धांत रूप में उप-उपवाक्य और उपवर्ग पूरी तरह से अलग चीजें हैं। लेकिन जिस भाषा की मुझे जानकारी नहीं है, उसके प्रकार और वर्ग वास्तव में इस तरह से काम करते हैं। आइए हमारी भाषा को समझना शुरू करें और हमारे कुछ फैसलों के पीछे तर्क को स्पष्ट करें।
सबसे पहले, भले ही सिद्धांत में पूरी तरह से अलग-अलग वर्गों को एक ही प्रकार दिया जा सकता है या किसी वर्ग को उसी प्रकार का मान दिया जा सकता है जो किसी भी वर्ग के उदाहरण नहीं हैं, यह गंभीर रूप से टाइपकेचर की उपयोगिता को बाधित करता है। टाइपकर्ता को प्रभावी ढंग से यह जांचने की क्षमता से लूट लिया जाता है कि क्या आप जिस पद्धति या क्षेत्र को एक अभिव्यक्ति के भीतर बुला रहे हैं, वह वास्तव में उस मूल्य पर मौजूद है, जो संभवत: एक चेक है जिसे आप पसंद करेंगे यदि आप उसके साथ खेलने की परेशानी में जा रहे हैं; typechecker। आखिरकार, कौन जानता है कि वास्तव में उस Stringलेबल के नीचे का मूल्य क्या है; यह कुछ ऐसा हो सकता है, जैसे, एक concatenateविधि बिल्कुल नहीं!
ठीक है तो चलिए यह तय करते हैं कि हर वर्ग अपने आप में उसी प्रकार का एक नया नाम उत्पन्न करता है जैसा कि उस वर्ग के associateसाथ होता है। यही कारण है कि हम में से छुटकारा पाने की सुविधा देता है associateके बीच अलग-अलग नामों के साथ-साथ StringClassऔर String।
इसी कारण से, हम संभवतः दो वर्गों के प्रकारों के बीच स्वचालित रूप से एक उप-प्रकार संबंध स्थापित करना चाहते हैं जहां एक दूसरे का उपवर्ग है। सभी उपवर्गों के बाद माता-पिता वर्ग के सभी तरीकों और क्षेत्रों की गारंटी है, लेकिन इसके विपरीत सच नहीं है। इसलिए, जबकि उप-वर्ग कभी भी गुजर सकता है, तो आपको एक प्रकार के मूल वर्ग की आवश्यकता होती है, यदि आपको उप-वर्ग के प्रकार की आवश्यकता है, तो मूल वर्ग के प्रकार को अस्वीकार कर दिया जाना चाहिए।
यदि आप इसे इस शर्त के साथ जोड़ते हैं कि सभी उपयोगकर्ता परिभाषित मूल्य एक वर्ग के उदाहरण होने चाहिए, तो आप is subclass ofडबल ड्यूटी खींच सकते हैं और छुटकारा पा सकते हैं is subtype of।
और यह हमें उन विशेषताओं के बारे में बताता है जो अधिकांश लोकप्रिय सांख्यिकीय रूप से टाइप की गई OO भाषाएँ साझा करती हैं। "आदिम" प्रकार (जैसे का एक सेट कर रहे हैं int, floatआदि) जो किसी भी वर्ग के साथ संबद्ध नहीं हैं और उपयोगकर्ता परिभाषित नहीं हैं। फिर आपके पास सभी उपयोगकर्ता-परिभाषित कक्षाएं हैं जो स्वचालित रूप से एक ही नाम के प्रकार हैं और उप-वर्ग के साथ उपवर्ग की पहचान करते हैं।
अंतिम नोट जो मैं बनाऊंगा, वह मूल्यों से अलग प्रकार की घोषणा करने की अकड़ के आसपास है। अधिकांश भाषाएं दो के निर्माण को भ्रमित करती हैं, ताकि एक प्रकार की घोषणा भी पूरी तरह से नए मूल्यों को उत्पन्न करने के लिए एक घोषणा है जो स्वचालित रूप से उस प्रकार के साथ लेबल किए जाते हैं। उदाहरण के लिए, एक वर्ग घोषणा आमतौर पर दोनों प्रकार के साथ-साथ उस प्रकार के तात्कालिक मूल्यों का एक तरीका बनाती है। यह कुछ अव्यवस्था से छुटकारा दिलाता है और, कंस्ट्रक्टरों की उपस्थिति में, आपको एक झटके में एक प्रकार के साथ असीम रूप से कई मानों को लेबल बनाने देता है।