सबटाइपिंग

प्रोग्रामिंग भाषा सिद्धांत में, सबटाइपिंग (उपप्रकार बहुरूपता या समावेशी बहुरूपता भी) बहुरूपता (कंप्यूटर विज्ञान) का एक रूप है जिसमें एक उपप्रकार एक डेटा प्रकार है जो प्रतिस्थापन की कुछ धारणा द्वारा किसी अन्य डेटाटाइप (सुपरटाइप) से संबंधित है, जिसका अर्थ है कि प्रोग्राम तत्व, आमतौर पर सबरूटीन्स या फ़ंक्शंस, जो सुपरटाइप के तत्वों पर काम करने के लिए लिखे गए हैं, वे सबटाइप के तत्वों पर भी काम कर सकते हैं। यदि S, T का उपप्रकार है, तो उपप्रकार बाइनरी संबंध (के रूप में लिखा गया है $S &lt;: T$,  $S ⊑ T$, या$S ≤: T$) का मतलब है कि टाइप एस के किसी भी शब्द को किसी भी संदर्भ में सुरक्षित रूप से इस्तेमाल किया जा सकता है जहां टाइप टी की उम्मीद की जाती है। यहां सबटाइपिंग का सटीक शब्दार्थ विशेष रूप से इस बात पर निर्भर करता है कि सुरक्षित रूप से कैसे उपयोग किया जाए और किसी भी संदर्भ को किसी औपचारिक_भाषा या प्रोग्रामिंग भाषा द्वारा परिभाषित किया जाए। एक प्रोग्रामिंग भाषा की प्रकार प्रणाली अनिवार्य रूप से अपने स्वयं के उपप्रकार संबंध को परिभाषित करती है, जो अच्छी तरह से पहचान संबंध हो सकती है, भाषा को रूपांतरण तंत्र का समर्थन नहीं करना चाहिए (या बहुत कम)।

सबटाइपिंग संबंध के कारण, एक शब्द एक से अधिक प्रकार का हो सकता है। उपप्रकार इसलिए बहुरूपता का एक रूप है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में 'पॉलीमॉर्फिज्म' शब्द का इस्तेमाल आमतौर पर केवल इस उपप्रकार पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि पैरामीट्रिक बहुरूपता की तकनीकों को सामान्य प्रोग्रामिंग माना जाएगा।

कार्यात्मक प्रोग्रामिंग भाषाएं अक्सर रिकॉर्ड (कंप्यूटर विज्ञान) के उपप्रकार की अनुमति देती हैं। नतीजतन, केवल टाइप किए गए लैम्ब्डा कैलकुलस को रिकॉर्ड प्रकारों के साथ विस्तारित करना शायद सबसे सरल सैद्धांतिक सेटिंग है जिसमें उपप्रकार की एक उपयोगी धारणा को परिभाषित और अध्ययन किया जा सकता है। क्योंकि परिणामी कलन शब्दों को एक से अधिक प्रकार की अनुमति देता है, यह अब एक साधारण प्रकार का सिद्धांत नहीं है। कार्यात्मक प्रोग्रामिंग भाषाओं के बाद से, परिभाषा के अनुसार, फ़ंक्शन शाब्दिक का समर्थन करता है, जिसे रिकॉर्ड में भी संग्रहीत किया जा सकता है, सबटाइपिंग के साथ रिकॉर्ड प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की कुछ विशेषताएं प्रदान करते हैं। आमतौर पर, कार्यात्मक प्रोग्रामिंग भाषाएं कुछ, आमतौर पर प्रतिबंधित, पैरामीट्रिक बहुरूपता का रूप भी प्रदान करती हैं। एक सैद्धांतिक सेटिंग में, दो विशेषताओं की बातचीत का अध्ययन करना वांछनीय है; एक सामान्य सैद्धांतिक सेटिंग सिस्टम F-sub|system F है&lt;:. ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सैद्धांतिक गुणों को कैप्चर करने का प्रयास करने वाली विभिन्न गणनाएं सिस्टम F से प्राप्त की जा सकती हैं&lt;:.

उपप्रकार की अवधारणा सम्मोहन और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में परिबद्ध परिमाणीकरण की अवधारणा से भी संबंधित है (आदेश-क्रमबद्ध तर्क देखें)। उप-टाइपिंग को वस्तु-उन्मुख भाषाओं से (कक्षा या वस्तु) वंशानुक्रम (कंप्यूटर विज्ञान) की धारणा के साथ भ्रमित नहीं होना चाहिए; सबटाइपिंग प्रकारों (ऑब्जेक्ट-ओरिएंटेड पार्लेंस में इंटरफेस) के बीच एक संबंध है, जबकि इनहेरिटेंस एक भाषा सुविधा से उपजी कार्यान्वयन के बीच एक संबंध है जो नई वस्तुओं को मौजूदा वस्तुओं से बनाने की अनुमति देता है। कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, सबटाइपिंग को इंटरफ़ेस इनहेरिटेंस कहा जाता है, विरासत के साथ कार्यान्वयन विरासत के रूप में जाना जाता है।

उत्पत्ति
प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे शुरुआत डेरिवेटिव्स में पेश किया गया था। सबटाइपिंग का पहला औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने निहित रूपांतरणों को औपचारिक बनाने के लिए श्रेणी सिद्धांत का उपयोग किया था, और लुका कार्डेली (1985)। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्यधारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में बहुरूपता के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, बारबरा लिस्कोव के बाद सुरक्षित प्रतिस्थापन के सिद्धांत को अक्सर लिस्कोव प्रतिस्थापन सिद्धांत कहा जाता है, जिसने इसे 1987 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर एक सम्मेलन में एक मुख्य भाषण में लोकप्रिय बनाया था। क्योंकि इसे परिवर्तनशील वस्तुओं पर विचार करना चाहिए, उपप्रकार की आदर्श धारणा लिस्कोव और जेनेट विंग द्वारा परिभाषित, जिसे व्यवहार उपप्रकार कहा जाता है, एक प्रकार के चेकर में लागू किए जा सकने वाले कार्यों की तुलना में काफी मजबूत है। (देखना विवरण के लिए नीचे।)

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

एक अधिक व्यावहारिक उदाहरण के रूप में, एक भाषा जहां भी फ़्लोटिंग पॉइंट मानों की अपेक्षा की जाती है, पूर्णांक मानों का उपयोग करने की अनुमति दे सकती है ( <:  ), या यह एक सामान्य प्रकार Number को पूर्णांकों और वास्तविक के सामान्य सुपरटाइप के रूप में परिभाषित कर सकता है। इस दूसरे मामले में, हमारे पास ही है   <:   और   <: , लेकिन   और   एक दूसरे के उपप्रकार नहीं हैं।

प्रोग्रामर इसके बिना संभव होने की तुलना में सबटाइपिंग अमूर्त सिद्धांत (प्रोग्रामिंग) का लाभ उठा सकते हैं। निम्नलिखित उदाहरण पर विचार करें:

<वाक्यविन्यास लैंग = वीबी> फ़ंक्शन अधिकतम (x संख्या के रूप में, y संख्या के रूप में) है अगर एक्स <वाई तब वापसी वाई अन्य वापसी एक्स अंत 

यदि पूर्णांक और वास्तविक दोनों उपप्रकार हैं, और एक मनमाना संख्या के साथ तुलना के एक ऑपरेटर को दोनों प्रकारों के लिए परिभाषित किया गया है, फिर इस फ़ंक्शन को किसी भी प्रकार के मान पास किए जा सकते हैं। हालांकि, इस तरह के एक ऑपरेटर को लागू करने की संभावना संख्या प्रकार को अत्यधिक बाधित करती है (उदाहरण के लिए, कोई एक जटिल संख्या के साथ पूर्णांक की तुलना नहीं कर सकता है), और वास्तव में केवल पूर्णांक के साथ पूर्णांक की तुलना करना, और वास्तविक के साथ वास्तविक, समझ में आता है। इस फ़ंक्शन को पुनर्लेखन करना ताकि यह केवल उसी प्रकार के 'x' और 'y' को स्वीकार करे, जिसके लिए बाध्य बहुरूपता की आवश्यकता होती है।

सबमिशन
टाइप थ्योरी में सबसम्प्शन की अवधारणा परिभाषित या मूल्यांकन करने के लिए प्रयोग किया जाता है कि क्या प्रकार S, प्रकार T का उपप्रकार है।

एक प्रकार मूल्यों का एक सेट है। सेट को सभी मूल्यों को सूचीबद्ध करके 'व्यापक रूप से' वर्णित किया जा सकता है, या संभावित मूल्यों के एक डोमेन पर एक विधेय द्वारा सेट की सदस्यता बताते हुए इसे 'आशयपूर्वक' वर्णित किया जा सकता है। सामान्य प्रोग्रामिंग लैंग्वेज में एन्यूमरेशन टाइप्स को लिस्टेड वैल्यूज द्वारा व्यापक रूप से परिभाषित किया जाता है। उपयोगकर्ता-परिभाषित प्रकार जैसे रिकॉर्ड (संरचनाएं, इंटरफेस) या कक्षाएं एक स्पष्ट प्रकार की घोषणा या मौजूदा मूल्य का उपयोग करके जानबूझकर परिभाषित की जाती हैं, जो कॉपी या विस्तारित किए जाने वाले प्रोटोटाइप के रूप में जानकारी को एन्कोड करती है।

उपधारणा की अवधारणा पर चर्चा करते हुए, एक प्रकार के मूल्यों के सेट को गणितीय इटैलिक में उसका नाम लिखकर इंगित किया जाता है: $T$. प्रकार, जिसे एक डोमेन पर एक विधेय के रूप में देखा जाता है, उसका नाम बोल्ड में लिखकर इंगित किया जाता है: T. पारंपरिक प्रतीक <: का अर्थ एक उपप्रकार है, और :> का अर्थ एक सुपरटाइप है।


 * यदि मानों का सेट है तो एक प्रकार टी  सबस्यूम  एस $T$ जो इसे परिभाषित करता है, वह समुच्चय का सुपरसेट है $S$, ताकि इसका हर सदस्य $S$ का भी सदस्य है $T$.
 * एक प्रकार को एक से अधिक प्रकार से सम्मिलित किया जा सकता है: S के सुपरटाइप्स पर प्रतिच्छेद करते हैं $S$.
 * यदि एस <: टी (और इसलिए $S ⊆ T$), फिर T, वह विधेय जो समुच्चय को परिचालित करता है $T$, विधेय S (समान डोमेन पर) का हिस्सा होना चाहिए जो परिभाषित करता है $S$.
 * यदि S, T को समाहित करता है, और T, S को समाहित करता है, तो दो प्रकार समान होते हैं (हालाँकि वे एक ही प्रकार के नहीं हो सकते हैं यदि प्रकार प्रणाली नाम से प्रकारों को अलग करती है)।

सूचना विशिष्टता के संदर्भ में, एक उपप्रकार को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में कम से कम उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह उपप्रकार की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या पेश किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का नुकसान यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो उपप्रकार के 'प्रचलन' को कम करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)।

सदस्यता के संदर्भ में, सेट-बिल्डर नोटेशन का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो एक सेट को परिभाषित करने के लिए एक विधेय का उपयोग करता है। विधेय को एक डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का सेट) $D$. विधेय आंशिक कार्य हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए: एक पूर्णांक मान 100 से अधिक या 200 से कम के बराबर है? . यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान लौटाता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस पैटर्न का एक रूप है।)

यदि दो विधेय हैं, $$P_T$$ जो टाइप टी के लिए चयन मानदंड लागू करता है, और $$P_s$$ जो प्रकार S के लिए अतिरिक्त मानदंड लागू करता है, फिर दो प्रकार के सेट परिभाषित किए जा सकते हैं:


 * $$T = \{v \in D \mid \ P_T(v)\}$$
 * $$S =\{v \in D \mid \ P_T(v)\text{ and }P_s(v)\}$$

विधेय $$\mathbf T = P_T$$ साथ लगाया जाता है $$P_s$$ यौगिक विधेय एस परिभाषित करने के भाग के रूप में $S$. दो विधेय संयुक्त हैं, इसलिए दोनों का चयन करने के लिए मूल्य के लिए सत्य होना चाहिए। विधेय $$\mathbf S = \mathbf T \land P_s = P_T \land P_s$$ विधेय T को ग्रहण करता है, इसलिए S <: T. उदाहरण के लिए: फेलिना नामक बिल्ली प्रजातियों की एक उपप्रजाति है, जो फेलिडे परिवार का हिस्सा है। जीनस फेलिस, जिससे घरेलू बिल्ली प्रजाति फेलिस कैटस संबंधित है, उस उपपरिवार का हिस्सा है।


 * $$\mathit{Felinae = \{cat \in Felidae \mid \ ofSubfamily(cat, felinaeSubfamilyName)\}}$$
 * $$\mathit{Felis =\{cat \in Felinae \mid \ ofGenus(cat, felisGenusName)\}}$$

पहले विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, Felis <: Felinae <: Felidae.

यदि T, S (T :> S) को समाहित करता है तो एक प्रक्रिया, कार्य या अभिव्यक्ति को एक मान दिया जाता है $$s \in S$$ एक ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप टी में से एक के रूप में काम करने में सक्षम होगा, क्योंकि $$s \in T$$. उपरोक्त उदाहरण में, हम उम्मीद कर सकते हैं कि सबफैमिली का कार्य सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर लागू होगा।

सबटाइपिंग योजनाएं
प्रकार सिद्धांतकार नाममात्र प्रकार प्रणाली के बीच अंतर करते हैं, जिसमें केवल एक निश्चित तरीके से घोषित प्रकार एक दूसरे के उपप्रकार हो सकते हैं, और संरचनात्मक प्रकार प्रणाली, जिसमें दो प्रकार की संरचना निर्धारित करती है कि एक दूसरे का उपप्रकार है या नहीं। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख भाषा के लिए एक संरचनात्मक उपप्रकार नियम यह कह सकता है कि यदि प्रकार 'ए' की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो 'बी' प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं (कंप्यूटर विज्ञान) एस), तो ए बी का एक उपप्रकार है, भले ही दूसरे से वंशानुक्रम (कंप्यूटर विज्ञान) हो या नहीं। यह तथाकथित बतख टाइपिंग गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में आम है। वस्तु प्रकार के अलावा अन्य प्रकार के लिए ध्वनि संरचनात्मक उपप्रकार नियम भी सर्वविदित हैं। सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के कार्यान्वयन दो सामान्य वर्गों में आते हैं: समावेशी कार्यान्वयन, जिसमें टाइप ए के किसी भी मूल्य का प्रतिनिधित्व भी टाइप बी पर समान मान का प्रतिनिधित्व करता है यदि ए <: बी, और जबरदस्त कार्यान्वयन, जिसमें टाइप ए का मान स्वचालित रूप से एक प्रकार बी में परिवर्तित किया जा सकता है। वस्तु-उन्मुख भाषा में उपवर्गीकरण द्वारा प्रेरित उपप्रकार आमतौर पर समावेशी होता है; पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों से संबंधित उपप्रकार संबंध, जो अलग-अलग प्रतिनिधित्व करते हैं, आमतौर पर ज़बरदस्त होते हैं।

सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की प्रणालियों में, यह रिफ्लेक्सिव (मतलब A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इसे प्रकारों पर एक पूर्व आदेश बनाता है।

चौड़ाई और गहराई उपप्रकार
रिकॉर्ड के प्रकार (कंप्यूटर विज्ञान) चौड़ाई और गहराई उपप्रकार की अवधारणाओं को जन्म देते हैं। ये एक नए प्रकार के रिकॉर्ड को प्राप्त करने के दो अलग-अलग तरीकों को व्यक्त करते हैं जो मूल रिकॉर्ड प्रकार के समान संचालन की अनुमति देता है।

याद रखें कि एक रिकॉर्ड (नामित) फ़ील्ड का एक संग्रह है। चूंकि एक उपप्रकार एक प्रकार है जो मूल प्रकार पर अनुमत सभी परिचालनों की अनुमति देता है, एक रिकॉर्ड उपप्रकार को फ़ील्ड पर उसी संचालन का समर्थन करना चाहिए जो मूल प्रकार समर्थित है।

इस तरह के समर्थन को प्राप्त करने का एक तरीका, जिसे चौड़ाई उपप्रकार कहा जाता है, रिकॉर्ड में और फ़ील्ड जोड़ता है। अधिक औपचारिक रूप से, प्रत्येक (नामित) क्षेत्र जो कि चौड़ाई सुपरटाइप में प्रदर्शित होता है, चौड़ाई उपप्रकार में दिखाई देगा। इस प्रकार, सुपरटाइप पर व्यवहार्य कोई भी ऑपरेशन उपप्रकार द्वारा समर्थित होगा।

दूसरी विधि, जिसे डेप्थ सबटाइपिंग कहा जाता है, विभिन्न क्षेत्रों को उनके उपप्रकारों से बदल देती है। अर्थात्, उपप्रकार के क्षेत्र सुपरटाइप के क्षेत्रों के उपप्रकार हैं। चूँकि सुपरटाइप में किसी फ़ील्ड के लिए समर्थित कोई भी ऑपरेशन उसके उपप्रकार के लिए समर्थित है, रिकॉर्ड सुपरटाइप पर संभव कोई भी ऑपरेशन रिकॉर्ड उपप्रकार द्वारा समर्थित है। गहराई उपप्रकार केवल अपरिवर्तनीय रिकॉर्ड के लिए समझ में आता है: उदाहरण के लिए, आप एक वास्तविक बिंदु (दो वास्तविक क्षेत्रों के साथ एक रिकॉर्ड) के 'x' फ़ील्ड को 1.5 असाइन कर सकते हैं, लेकिन आप 'x' फ़ील्ड के समान नहीं कर सकते एक पूर्णांक बिंदु (जो, हालांकि, वास्तविक बिंदु प्रकार का एक गहरा उपप्रकार है) क्योंकि 1.5 एक पूर्णांक नहीं है (सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) देखें)।

अभिलेखों की उप-टाइपिंग को System F-sub|System F में परिभाषित किया जा सकता है<:, जो रिकॉर्ड प्रकारों के उपप्रकार के साथ पैरामीट्रिक बहुरूपता को जोड़ती है और कई कार्यात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं।

कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे बीजगणितीय डेटा प्रकार) के उप-टाइपिंग का भी समर्थन करती हैं। चौड़ाई उपप्रकार का नियम उलटा है: चौड़ाई उपप्रकार में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए।

समारोह प्रकार
अगर $T_{1} → T_{2}$ एक फ़ंक्शन प्रकार है, तो इसका एक उप प्रकार कोई फ़ंक्शन प्रकार है $S_{1} → S_{2}$ उस संपत्ति के साथ $T_{1} <: S_{1}$ और $S_{2} <: T_{2}.$ निम्नलिखित टाइपिंग नियम का उपयोग करके इसे संक्षेप में प्रस्तुत किया जा सकता है:

$${T_1 \leq: S_1 \quad S_2 \leq: T_2} \over {S_1 \rightarrow S_2 \leq: T_1 \rightarrow T_2} $$ पैरामीटर प्रकार $S_{1} → S_{2}$ सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) कहा जाता है क्योंकि इसके लिए उपप्रकार संबंध उल्टा होता है, जबकि वापसी का प्रकार सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) है। अनौपचारिक रूप से, यह उलटा होता है क्योंकि परिष्कृत प्रकार उन प्रकारों में अधिक उदार होता है जिन्हें वह स्वीकार करता है और जिस प्रकार से लौटता है उसमें अधिक रूढ़िवादी होता है। स्काला (प्रोग्रामिंग भाषा) में यही वास्तव में काम करता है: एक एन-आरी फ़ंक्शन आंतरिक रूप से एक वर्ग है जो इनहेरिट करता है $$\mathtt{ Function_N({-A_1}, {-A_2}, \dots, {-A_n}, {+B})}$$ विशेषता (कंप्यूटर प्रोग्रामिंग) (जिसे जावा (प्रोग्रामिंग भाषा) जैसी भाषाओं में एक सामान्य अप्लिकेशन प्रोग्रामिंग अंतरफलक के रूप में देखा जा सकता है), जहां $$\mathtt{A_1, A_2, \dots, A_n}$$ पैरामीटर प्रकार हैं, और $$\mathtt{B}$$ इसका वापसी प्रकार है; − प्रकार से पहले का अर्थ है कि प्रकार प्रतिपरिवर्ती है जबकि + का अर्थ सहपरिवर्ती है।

अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं की तरह साइड इफेक्ट की अनुमति देने वाली भाषाओं में, उप-टाइपिंग आम तौर पर यह गारंटी देने के लिए पर्याप्त नहीं है कि एक फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का काम व्यवहार उपप्रकार पर केंद्रित है, जो इस लेख में चर्चा की गई प्रकार प्रणाली सुरक्षा के अलावा यह भी आवश्यक है कि उपप्रकार अनुबंध द्वारा कुछ डिजाइन में सुपरटेप द्वारा गारंटीकृत सभी अपरिवर्तनीय (कंप्यूटर विज्ञान) को संरक्षित करें। उपप्रकार की यह परिभाषा आम तौर पर अनिर्णीत समस्या है, इसलिए इसे एक प्रकार के चेकर द्वारा सत्यापित नहीं किया जा सकता है।

अपरिवर्तनीय वस्तुओं का उपप्रकार पैरामीटर मानों और वापसी मूल्यों के उपचार के समान है। राइट-ओनली रेफरेंस (या सिंक) कंट्रावेरिएंट हैं, जैसे पैरामीटर मान; रीड-ओनली रेफरेंस (या स्रोत) कॉन्वर्सिएंट हैं, जैसे रिटर्न वैल्यू। परिवर्तनीय संदर्भ जो स्रोत और सिंक दोनों के रूप में कार्य करते हैं, वे अपरिवर्तनीय हैं।

विरासत के साथ संबंध
उपप्रकार और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, लेकिन कोई भी दूसरे का विशेष मामला नहीं है। दूसरे शब्दों में, दो प्रकार S और T के बीच, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं: पहला मामला स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे  और.
 * 1) S न तो उपप्रकार है और न ही T का व्युत्पन्न प्रकार है
 * 2) S एक उपप्रकार है लेकिन T का व्युत्पन्न प्रकार नहीं है
 * 3) S एक उपप्रकार नहीं है, बल्कि T का एक व्युत्पन्न प्रकार है
 * 4) S एक उप प्रकार और T का व्युत्पन्न प्रकार दोनों है

दूसरे मामले को बीच के संबंध से चित्रित किया जा सकता है  और. अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में,  विरासत से संबंधित नहीं हैं. हालाँकि  का उपप्रकार माना जा सकता है   चूंकि किसी भी 32 बिट पूर्णांक मान को 64 बिट पूर्णांक मान में प्रचारित किया जा सकता है।

तीसरा मामला कार्यों के उपप्रकार का परिणाम है। मान लें कि टाइप टी का एक सुपर क्लास है जिसमें एक ही प्रकार की वस्तु लौटाने वाली विधि एम है (यानी एम का प्रकार टी → टी है, यह भी ध्यान दें कि एम का पहला पैरामीटर यह/स्वयं है) और टी से एक व्युत्पन्न वर्ग प्रकार एस वंशानुक्रम से, S में m का प्रकार S → S है। S को T का उपप्रकार होने के लिए S में m का प्रकार T में m के प्रकार का उपप्रकार होना चाहिए, दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम एक अप्रतिवर्ती संबंध है, S, T का उपप्रकार नहीं हो सकता।

उपप्रकार और वंशानुक्रम तब संगत होते हैं जब सभी विरासत में मिले क्षेत्र और व्युत्पन्न प्रकार के तरीकों में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के उपप्रकार होते हैं और विरासत में मिले प्रकार के तरीके होते हैं।

ज़बरदस्ती
जबरदस्ती उपप्रकार प्रणालियों में, उपप्रकारों को उपप्रकार से सुपरटाइप में अंतर्निहित प्रकार रूपांतरण कार्यों द्वारा परिभाषित किया जाता है। प्रत्येक उपप्रकार संबंध (S <: T) के लिए, एक ज़बरदस्ती कार्य बल: S → T प्रदान किया जाता है, और प्रकार S के किसी भी वस्तु को वस्तु बल के रूप में माना जाता हैS → T(s) टाइप T का। एक ज़बरदस्ती फ़ंक्शन को रचना द्वारा परिभाषित किया जा सकता है: यदि S <: T और T <: U तो s को यौगिक ज़बरदस्ती (ज़बरदस्ती) के तहत टाइप यू की वस्तु के रूप में माना जा सकता हैT → U ∘ ज़बरदस्तीS → T). प्रकार की ज़बरदस्ती एक प्रकार से अपने आप में ज़बरदस्तीT → T पहचान समारोह आईडी हैT.

रिकॉर्ड के लिए ज़बरदस्ती कार्य और संघ उपप्रकारों को अलग करना घटक के अनुसार परिभाषित किया जा सकता है; चौड़ाई-विस्तारित रिकॉर्ड के मामले में, प्रकार की ज़बरदस्ती केवल उन घटकों को छोड़ देती है जो सुपरटेप में परिभाषित नहीं हैं। फ़ंक्शन प्रकारों के लिए प्रकार का दबाव f'(s) = ज़बरदस्ती द्वारा दिया जा सकता हैS 2 → टी2 (एफ (ज़बरदस्तीT 1 → एस1 (t))), पैरामीटर मानों के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और वापसी मूल्यों के सहप्रसरण को दर्शाता है।

जबरदस्ती का कार्य विशिष्ट रूप से उपप्रकार और supertype को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई उपप्रकार संबंधों को परिभाषित किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि सभी प्रकार के दबाव सुसंगत हैं। उदाहरण के लिए, यदि एक पूर्णांक जैसे 2: इंट को एक फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए ज़बरदस्ती किया जा सकता है, तो यह 2.1: फ़्लोट टू 2: इंट के लिए ज़बरदस्ती स्वीकार्य नहीं है, क्योंकि यौगिक ज़बरदस्ती ज़बरदस्तीfloat → float जबरदस्ती दिया गयाint → float ∘ ज़बरदस्तीfloat → int तब पहचान ज़बरदस्ती आईडी से अलग होगाfloat.

यह भी देखें

 * सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)
 * वृत्त-दीर्घवृत्त समस्या (मूल्य-प्रकारों के समान आधार पर चर-प्रकारों को उपप्रकार करने के खतरों के लिए)
 * कक्षा आधारित प्रोग्रामिंग
 * शीर्ष प्रकार
 * शोधन प्रकार
 * व्यवहार उपप्रकार

संदर्भ
Textbooks


 * Benjamin C. Pierce, Types and programming languages, MIT Press, 2002, ISBN 0-262-16209-1, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
 * C. Szyperski, D. Gruntz, S. Murer, Component software: beyond object-oriented programming, 2nd ed., Pearson Education, 2002, ISBN 0-201-74572-0, pp. 93–95 (a high-level presentation aimed at programming language users)

Papers


 * Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).

अग्रिम पठन

 * John C. Reynolds, Theories of programming languages, Cambridge University Press, 1998, ISBN 0-521-59414-6, chapter 16.
 * Martín Abadi, Luca Cardelli, A theory of objects, Springer, 1996, ISBN 0-387-94775-2. Section 8.6 contrast the subtyping of records and objects.