उपवर्ग और उप-प्रकार के बीच क्या अंतर है?


44

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

ऑब्जेक्ट-ओरिएंटेड भाषाओं के लिए, जिनसे मैं सबसे अधिक परिचित हूं (पायथन, सी ++), "टाइप" और "क्लास" समानार्थक अवधारणाएं हैं। C ++ के संदर्भ में, उप-प्रकार और उपवर्ग के बीच अंतर होने का क्या मतलब होगा? उदाहरण के लिए, कहिए, Fooयह एक उपवर्ग है, लेकिन उप-प्रकार नहीं है FooBase। यदि fooइसका उदाहरण है Foo, तो क्या यह पंक्ति होगी:

FooBase* fbPoint = &foo;

अब मान्य नहीं होगा?


6
दरअसल, पायथन में "टाइप" और "क्लास" अलग अवधारणाएं हैं। वास्तव में, पायथन गतिशील टाइप किया जा रहा है, "प्रकार" नहीं एक अवधारणा है सब पर पायथन में। दुर्भाग्य से, पायथन डेवलपर्स यह नहीं समझते हैं, और अभी भी दोनों को भ्रमित करते हैं।
जोर्ग डब्ल्यू मित्तग

11
"टाइप" और "क्लास" C ++ में भी अलग हैं। "चींटियों की सरणी" एक प्रकार है; यह किस वर्ग का है? "प्रकार int के एक चर के लिए सूचक" एक प्रकार है; यह किस वर्ग का है? ये चीजें किसी भी वर्ग की नहीं हैं, लेकिन वे निश्चित रूप से टाइप हैं।
एरिक लिपर्ट

2
मैं उस सवाल और उस जवाब को पढ़ने के बाद बहुत सोच रहा था।
user369450

4
@JorgWMittag अगर अजगर में "प्रकार" की कोई अवधारणा नहीं है, तो किसी को यह बताना चाहिए कि जो कोई भी दस्तावेज लिखता है: docs.python.org/3/library/stdtypes.html
मैट

@ मेच्योर होने के लिए, टाइप्स ने इसे 3.5 में बनाया, जो कि हाल ही में बहुत सुंदर है, विशेष रूप से व्हाट्सएप-आई-एम-टू-यूज़-इन-प्रोडक्शन मानकों द्वारा।
जारेद स्मिथ

जवाबों:


53

सबटाइपिंग एक प्रकार का बहुरूपता का एक रूप है जिसमें एक उपप्रकार एक डेटाटाइप है जो किसी अन्य डेटाटाइप (सुपरटेप) से संबंधित है प्रतिस्थापन की कुछ धारणा से, जिसका अर्थ है कि प्रोग्राम तत्व, आमतौर पर सबरूटीन्स या फ़ंक्शन, जो सुपरटाइप के तत्वों पर काम करने के लिए लिखे गए हैं। उपप्रकार के तत्वों पर काम करते हैं।

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

उपवर्ग को उपप्रकार से भ्रमित नहीं होना चाहिए। सामान्य तौर पर, सबटाइपिंग एक-एक संबंध स्थापित करता है, जबकि उप-वर्ग केवल कार्यान्वयन का पुन: उपयोग करता है और एक सिंटैक्टिक संबंध स्थापित करता है, जरूरी नहीं कि सिमेंटिक रिलेशनशिप (वंशानुक्रम व्यवहार उपप्रकार सुनिश्चित नहीं करता है)।

इन अवधारणाओं को अलग करने के लिए, सबटाइपिंग को इंटरफेस इनहेरिटेंस के रूप में भी जाना जाता है , जबकि उपवर्ग को कार्यान्वयन विरासत या कोड विरासत के रूप में जाना जाता है

संदर्भ
Subtyping
विरासत


1
बहुत सही कहा। यह प्रश्न के संदर्भ में ध्यान देने योग्य हो सकता है कि C ++ प्रोग्रामर अक्सर टाइप सिस्टम के लिए उप-संबंधों को संप्रेषित करने के लिए शुद्ध आभासी आधार वर्गों को नियुक्त करते हैं। जेनेरिक प्रोग्रामिंग दृष्टिकोण अक्सर कोर्स के पसंदीदा होते हैं।
अलुआन हदद

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

ढेर पर एक और नमूना: अगर मुझे सही तरीके से समझ में आया, तो C ++ में, publicवंशानुक्रम एक उपप्रकार का परिचय देता है जबकि privateवंशानुक्रम एक उपवर्ग का परिचय देता है।
क्वेंटिन

@ क्वेंटिन पब्लिक इनहेरिटेंस एक उपप्रकार और उपवर्ग दोनों है, लेकिन निजी अभी तक केवल एक उपवर्ग है, लेकिन उपप्रकार नहीं। आप जावा इंटरफेस जैसी संरचनाओं के साथ उपवर्ग के बिना सबटाइपिंग कर सकते हैं
बराबर

27

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

एक वर्ग विधियों का एक बंडल है। यह व्यवहार कार्यान्वयन का एक सेट है ।

घटाव प्रोटोकॉल को परिष्कृत करने का एक साधन है। सबक्लासिंग अंतर कोड री- यूज़ का एक साधन है, यानी कोड का व्यवहार में अंतर का वर्णन करके फिर से उपयोग करना।

यदि आपने जावा या C♯ का उपयोग किया है, तो आप इस सलाह पर आ सकते हैं कि सभी प्रकार के प्रकार होने चाहिए interface। वास्तव में, यदि आप विलियम कुक के अंडरस्टैंडिंग डेटा एबस्ट्रेक्शन, रिविजिटेड को पढ़ते हैं , तो आप जान सकते हैं कि उन भाषाओं में OO करने के लिए, आपको केवल प्रकारों के रूप में उपयोग करना होगाinterface । (इसके अलावा, मजेदार तथ्य: जावा का interfaceसीधा उद्देश्य ऑब्जेक्टिव-सी के प्रोटोकॉल से है, जो कि स्मॉलकॉल से सीधे लिया जाता है।)

अब, अगर हम उस तार्किक निष्कर्ष पर उस कोडिंग सलाह का पालन करते हैं और जावा के एक संस्करण की कल्पना करते हैं, जहां केवल interface एस प्रकार हैं, और कक्षाएं और आदिम नहीं हैं, तो एक interfaceदूसरे से विरासत में एक उप-संबंध संबंध बनाएंगे, जबकि एक classदूसरे से विरासत में मिला होगा। केवल अंतर कोड के माध्यम से पुन: उपयोग के लिए हो super

जहां तक ​​मुझे पता है, कोई भी मुख्यधारा की वैधानिक रूप से टाइप की जाने वाली भाषाएं नहीं हैं, जो विरासत में मिली कोड (कार्यान्वयन विरासत / उपवर्ग) और विरासत में मिले अनुबंधों (उपप्रकार) के बीच सख्ती से अंतर करती हैं। जावा और C♯, इंटरफ़ेस विरासत शुद्ध subtyping है (या कम से कम था, जावा 8 में डिफ़ॉल्ट तरीकों का परिचय और साथ ही संभावना C♯ 8 तक), लेकिन वर्ग विरासत है भी कार्यान्वयन विरासत के साथ ही subtyping। मुझे याद है कि एक प्रायोगिक रूप से टाइप की गई वस्तु-उन्मुख LISP बोली के बारे में पढ़ना, जो मिक्सिन्स (जिसमें व्यवहार होता है), स्ट्रक्चर्स (जिसमें स्टेट होता है), इंटरफेस (जो वर्णन करते हैं , के बीच सख्ती से प्रतिष्ठित है।व्यवहार), और कक्षाएं (जो एक या अधिक मिश्रणों के साथ शून्य या अधिक संरचना की रचना करती हैं और एक या अधिक इंटरफेस के अनुरूप होती हैं)। केवल कक्षाओं को तत्काल किया जा सकता है, और केवल इंटरफेस को प्रकार के रूप में उपयोग किया जा सकता है।

एक गतिशील रूप से टाइप की गई OO भाषा में जैसे Python, Ruby, ECMAScript या Smalltalk, हम आम तौर पर किसी ऑब्जेक्ट के प्रकार (ओं) के बारे में सोचते हैं, जो प्रोटोकॉल के सेट के अनुरूप हैं। बहुवचन पर ध्यान दें: एक वस्तु के कई प्रकार हो सकते हैं, और मैं सिर्फ इस तथ्य के बारे में बात नहीं कर रहा हूं कि प्रत्येक प्रकार Stringकी वस्तु भी प्रकार की वस्तु है Object। (बीटीडब्ल्यू: ध्यान दें कि मैंने किस प्रकार के बारे में बात करने के लिए वर्ग नामों का उपयोग किया है? मैं कैसे बेवकूफ हूं!) एक ऑब्जेक्ट कई प्रोटोकॉल को लागू कर सकता है। उदाहरण के लिए, रूबी में Arrays, उन्हें संलग्न किया जा सकता है, उन्हें अनुक्रमित किया जा सकता है, उन्हें अधिक पुनरावृत्त किया जा सकता है, और उनकी तुलना की जा सकती है। यह चार अलग-अलग प्रोटोकॉल हैं जो वे लागू करते हैं!

अब, रूबी के पास प्रकार नहीं हैं। लेकिन रूबी समुदाय के प्रकार हैं! वे केवल प्रोग्रामर के सिर में मौजूद हैं, हालांकि। और प्रलेखन में। उदाहरण के लिए, कोई भी वस्तु जो eachअपने तत्वों को एक के बाद एक करके बताई गई विधि का जवाब देती है, एक गूढ़ वस्तु मानी जाती है । और एक मिक्सिन कहा जाता है Enumerableजो इस प्रोटोकॉल पर निर्भर करता है। इसलिए, यदि आपका वस्तु सही है प्रकार (जो केवल प्रोग्रामर के सिर में मौजूद है), तो यह में (से विरासत) मिश्रण करने की अनुमति दी है Enumerablemixin, और यह अच्छी तरह के लिए मुफ्त, जैसे शांत तरीकों के सभी प्रकार के मिल map, reduce, filterऔर इतने पर।

इसी तरह, एक वस्तु का जवाब अगर <=>है, तो इसे लागू करने में माना जाता है तुलनीय प्रोटोकॉल, और उस में मिश्रण कर सकते हैं Comparablemixin और जैसे सामान मिलता है <, <=, >, <=, ==, between?, और clampमुक्त करने के लिए। हालांकि, यह उन सभी तरीकों को भी लागू कर सकता है, और Comparableसभी से विरासत में नहीं मिलता है , और यह अभी भी तुलनीय माना जाएगा ।

एक अच्छा उदाहरण है StringIOपुस्तकालय है, जो अनिवार्य नकली आई / ओ तार के साथ धाराओं। यह IOकक्षा के समान सभी तरीकों को लागू करता है , लेकिन दोनों के बीच कोई विरासत संबंध नहीं है। फिर भी, एक कैन का StringIOइस्तेमाल हर जगह किया IOजा सकता है। यह यूनिट परीक्षणों में बहुत उपयोगी है, जहां आप अपने प्रोग्राम में कोई और बदलाव किए बिना एक फ़ाइल या stdinएक के साथ बदल सकते हैं StringIO। चूंकि StringIOएक ही प्रोटोकॉल के अनुरूप है IO, वे दोनों एक ही प्रकार के हैं, भले ही वे अलग-अलग वर्ग हैं, और कोई संबंध साझा नहीं करते हैं (तुच्छ के अलावा जो वे दोनों Objectकिसी बिंदु पर बढ़ाते हैं )।


यह मददगार हो सकता है यदि भाषाएं कार्यक्रमों को एक साथ एक वर्ग प्रकार और एक इंटरफ़ेस घोषित करने की अनुमति देती हैं जिसके लिए वह वर्ग एक कार्यान्वयन है, और कार्यान्वयन को "कंस्ट्रक्टर" (जो कि इंटरफ़ेस द्वारा निर्दिष्ट वर्गों के कंस्ट्रक्टरों को श्रृंखलाबद्ध करेगा) को निर्दिष्ट करने की अनुमति देता है। उन प्रकार की वस्तुओं के लिए, जिनके लिए संदर्भ सार्वजनिक रूप से साझा किए जाएंगे, पसंदीदा पैटर्न यह होगा कि वर्ग प्रकार का उपयोग केवल तब किया जाता है जब व्युत्पन्न वर्ग बनाते हैं; अधिकांश संदर्भ इंटरफ़ेस प्रकार के होने चाहिए। इंटरफ़ेस निर्माणकर्ताओं को निर्दिष्ट करने में सक्षम होना उन स्थितियों में सहायक होगा जहां ...
सुपरकैट

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

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

@tel: नहीं, क्षमा करें। यह लगभग 15-20 साल पहले था, और उस समय मेरी रुचि सभी जगह थी। मैं संभवतः आपको यह बताना शुरू नहीं कर सकता कि जब मैं इस पार गया था, तब मैं क्या देख रहा था।
जोर्ग डब्ल्यू मित्तग

Awww। इन सभी उत्तरों में यह सबसे दिलचस्प विवरण था। यह तथ्य कि उन अवधारणाओं का एक औपचारिक अलगाव वास्तव में मेरे लिए वर्ग / प्रकार के भेद को स्पष्ट करने में मदद की गई भाषा के कार्यान्वयन के भीतर संभव है। मुझे लगता है कि मैं खुद उस LISP की तलाश करूंगा, किसी भी मामले में। क्या आपको याद है कि क्या आप इसके बारे में एक पत्रिका लेख / पुस्तक में पढ़ते हैं, या यदि आपने अभी इसके बारे में बातचीत में सुना है?
दूरभाष

2

यह शायद एक प्रकार और वर्ग के बीच अंतर करने के लिए पहले उपयोगी है और फिर उप-उप और उपवर्ग के बीच के अंतर में गोता लगाएँ।

इस उत्तर के बाकी हिस्सों के लिए मैं यह मानने जा रहा हूं कि चर्चा के प्रकार स्थिर प्रकार हैं (क्योंकि आमतौर पर सबटिप करने के बाद एक स्थिर संदर्भ में आता है)।

मैं एक प्रकार और वर्ग के बीच के अंतर को स्पष्ट करने में मदद करने के लिए एक खिलौना स्यूडोकोड विकसित करने जा रहा हूं क्योंकि अधिकांश भाषाएं उन्हें कम से कम भाग में (अच्छे कारण के लिए बताती हैं कि मैं संक्षेप में स्पर्श करूंगा)।

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

हमारी खिलौना भाषा में हम जैसे लेबल के निर्माण की अनुमति दे सकते हैं।

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आदि) जो किसी भी वर्ग के साथ संबद्ध नहीं हैं और उपयोगकर्ता परिभाषित नहीं हैं। फिर आपके पास सभी उपयोगकर्ता-परिभाषित कक्षाएं हैं जो स्वचालित रूप से एक ही नाम के प्रकार हैं और उप-वर्ग के साथ उपवर्ग की पहचान करते हैं।

अंतिम नोट जो मैं बनाऊंगा, वह मूल्यों से अलग प्रकार की घोषणा करने की अकड़ के आसपास है। अधिकांश भाषाएं दो के निर्माण को भ्रमित करती हैं, ताकि एक प्रकार की घोषणा भी पूरी तरह से नए मूल्यों को उत्पन्न करने के लिए एक घोषणा है जो स्वचालित रूप से उस प्रकार के साथ लेबल किए जाते हैं। उदाहरण के लिए, एक वर्ग घोषणा आमतौर पर दोनों प्रकार के साथ-साथ उस प्रकार के तात्कालिक मूल्यों का एक तरीका बनाती है। यह कुछ अव्यवस्था से छुटकारा दिलाता है और, कंस्ट्रक्टरों की उपस्थिति में, आपको एक झटके में एक प्रकार के साथ असीम रूप से कई मानों को लेबल बनाने देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.