जवाबों:
निम्नलिखित उत्तर Gof पुस्तक ( डिज़ाइन पैटर्न ) से है
ऑब्जेक्ट का क्लास परिभाषित करता है कि ऑब्जेक्ट कैसे लागू किया जाता है। क्लास ऑब्जेक्ट की आंतरिक स्थिति और उसके संचालन के कार्यान्वयन को परिभाषित करता है।
इसके विपरीत, एक वस्तु का प्रकार केवल इसके इंटरफ़ेस को संदर्भित करता है - अनुरोधों का एक सेट, जिसके लिए यह प्रतिक्रिया दे सकता है।
एक वस्तु के कई प्रकार हो सकते हैं, और विभिन्न वर्गों की वस्तुएँ एक ही प्रकार की हो सकती हैं।
//example in c++
template<typename T>
const T & max(T const & a,T const &b)
{
return a>b?a:b; //> operator of the type is used for comparison
}
अधिकतम फ़ंक्शन को ऑपरेशन के साथ एक प्रकार की आवश्यकता होती है > अपने स्वयं के प्रकार के साथ इसमें से किसी भी वर्ग को इंटरफ़ेस करता है जो उपरोक्त आवश्यकता को पूरा करता है उस वर्ग के लिए विशिष्ट अधिकतम फ़ंक्शन उत्पन्न करने के लिए उपयोग किया जा सकता है।
मैं हमेशा 'क्लासेस' और 'प्राइमेटीज़' के लिए एक 'टाइप' के बारे में सोचता हूँ।
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
विकिपीडिया से प्रेरित ...
में प्रकार सिद्धांत शर्तें;
एक प्रकार एक सार इंटरफ़ेस है।
प्रकार आम तौर पर संज्ञाओं का प्रतिनिधित्व करते हैं, जैसे कि एक व्यक्ति, स्थान या चीज़, या कुछ नामांकित,
एक वर्ग प्रकार के कार्यान्वयन का प्रतिनिधित्व करता है।
यह एक ठोस डेटा संरचना और सबरूटीन्स का संग्रह है
विभिन्न ठोस कक्षाएं एक ही अमूर्त प्रकार की वस्तुओं (प्रकार प्रणाली के आधार पर) का उत्पादन कर सकती हैं।
* उदाहरण के लिए, कोई भी दो वर्गों के साथ प्रकार लागू कर सकता है : (छोटे स्टैक्स के लिए तेज़, लेकिन खराब तरीके से तराजू) और (छोटे स्टैक्स के लिए अच्छी तरह से लेकिन उच्च ओवरहेड)। *।Stack
SmallStack
ScalableStack
इसी तरह, किसी दिए गए वर्ग में कई अलग-अलग निर्माता हो सकते हैं ।
केले का उदाहरण।
एक
Banana
प्रकार सामान्य रूप से केले के गुणों और कार्यक्षमता का प्रतिनिधित्व करता है।
ABCBanana
औरXYZBanana
कक्षाओं का निर्माण केले के तरीके का प्रतिनिधित्व करते हैं।
(वास्तविक जीवन में विभिन्न केले आपूर्तिकर्ताओं, या एक वीडियो गेम में केले का प्रतिनिधित्व और आकर्षित करने के लिए अलग-अलग डेटा संरचनाएं और फ़ंक्शन)।
ABCBanana
वर्ग तो विशेष रूप से केले जो कर रहे हैं उत्पादन कर सकता उदाहरणों केABCBanana
वर्ग , वे होगा वस्तुओं का प्रकार केले ।
यह दुर्लभ नहीं है प्रोग्रामर एक प्रकार के लिए एकल और केवल कार्यान्वयन प्रदान करता है। इस मामले में वर्ग का नाम अक्सर प्रकार के नाम के साथ समान होता है । लेकिन अभी भी एक प्रकार है (जिसे आवश्यकता पड़ने पर इंटरफ़ेस में निकाला जा सकता है), और एक कार्यान्वयन (जो अलग इंटरफ़ेस को लागू करेगा) जो कक्षा के उदाहरण (ऑब्जेक्ट) बनाता है।
प्रकार सभी उपलब्ध ऑब्जेक्ट टेम्प्लेट या अवधारणाओं के लिए छत्र शब्द है। एक क्लास एक ऐसा ऑब्जेक्ट टेम्प्लेट है। तो संरचना प्रकार, पूर्णांक प्रकार, इंटरफ़ेस प्रकार आदि हैं। ये सभी प्रकार हैं
यदि आप चाहें, तो आप इसे इस तरह देख सकते हैं: एक प्रकार की मूल अवधारणा है। अन्य सभी अवधारणाएँ: वर्ग, इंटरफ़ेस, संरचना, पूर्णांक आदि इस अवधारणा से विरासत में मिली हैं। वे प्रकार हैं
प्रकार में डेटा का विवरण होता है (जैसे गुण, संचालन, आदि),
कक्षा एक विशिष्ट प्रकार है - यह वस्तुओं का उदाहरण बनाने के लिए एक टेम्पलेट है ।
कड़ाई से बोलने वाला वर्ग एक विशेष अवधारणा है, इसे एक पैकेज के रूप में देखा जा सकता है जिसमें किसी वस्तु के कुछ पहलुओं का वर्णन मेटाडेटा का सबसेट होता है ।
उदाहरण के लिए C # में आप इंटरफेस और कक्षाएं पा सकते हैं। वे दोनों प्रकार हैं, लेकिन इंटरफ़ेस केवल कुछ अनुबंध को परिभाषित कर सकता है और कक्षाओं के विपरीत तत्काल नहीं किया जा सकता है।
बस बोलने वाला वर्ग एक विशेष प्रकार है जिसका उपयोग किसी वस्तु के गुणों और व्यवहार को घेरने के लिए किया जाता है।
विकिपीडिया आपको अधिक पूर्ण उत्तर दे सकता है:
इसे सबसे तेज़ तरीका बताने के लिए:
एक संरचना एक प्रकार है, लेकिन एक संरचना एक वर्ग नहीं है।
जैसा कि आप देख सकते हैं, एक प्रकार न केवल वर्गों की परिभाषाओं के लिए एक "सार" शब्द है, बल्कि फ्लोट, इंट, बूल जैसे संरचनात्मक और आदिम डेटा प्रकार भी हैं।
Type
दिखाया गया है ( जैसा कि दिखाया गया है) एक सिस्टम क्लास ( System.Type
) का संक्षिप्त नाम है, जिसका उपयोग प्रकारों के विवरण रखने के लिए किया जाता है।
टाइप वैचारिक रूप से क्लास का सुपरसेट है। व्यापक अर्थों में, एक वर्ग एक प्रकार का एक प्रकार है।
बारीकी से कक्षाओं से संबंधित इंटरफेस हैं, जो मधुमक्खी को एक बहुत ही विशेष प्रकार के वर्ग के रूप में देखा जा सकता है - एक विशुद्ध रूप से सार। ये भी प्रकार हैं।
तो "प्रकार" कक्षाओं, इंटरफेस और अधिकांश भाषाओं में भी शामिल है। इसके अलावा डॉट-नेट सीएलआर जैसे प्लेटफार्मों में संरचना प्रकार भी हैं।
भेद का एक और उदाहरण जोड़ने के लिए: C ++ में आपके पास सूचक और संदर्भ प्रकार होते हैं जो कक्षाओं को संदर्भित कर सकते हैं, लेकिन स्वयं में और कक्षाओं में नहीं हैं।
Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"
ध्यान दें कि केवल एक वर्ग शामिल है, लेकिन निकट प्रकार की अनंत संख्या का उपयोग किया जा सकता है। कुछ भाषाओं में, फ़ंक्शन को "प्रथम श्रेणी की वस्तुएं" माना जाता है, इस स्थिति में, फ़ंक्शन का प्रकार एक वर्ग होता है। दूसरों में, एक फ़ंक्शन का प्रकार केवल एक संकेतक है। कक्षाओं में आम तौर पर डेटा धारण करने में सक्षम होने की अवधारणाएं होती हैं, साथ ही उस डेटा पर संचालन भी होता है।
मेरे विचार बहुत हद तक एक्यू के जवाब के अनुरूप हैं।
मैं वस्तुओं के निर्माण के लिए एक टेम्पलेट के रूप में कक्षाओं को देखता हूं, जबकि प्रकार उन वस्तुओं को वर्गीकृत करने का एक तरीका है, और हमें उन्हें एक इंटरफ़ेस प्रदान करते हैं।
पायथन भी मेटाक्लासेस जोड़ता है, जो सिर्फ कक्षाओं के निर्माण के लिए एक तंत्र है, उसी तरह जैसे क्लास ऑब्जेक्ट का निर्माण करते हैं (और अच्छी तरह से, क्लास और मेटाक्लास दोनों ऑब्जेक्ट हैं)।
लांबा में एक ही सवाल का यह जवाब मुझे एक संपूर्ण विवरण की तरह लगता है।
नीचे से GOF उद्धरण से लिया गया:
ऑब्जेक्ट का क्लास परिभाषित करता है कि ऑब्जेक्ट कैसे लागू किया जाता है। क्लास ऑब्जेक्ट की आंतरिक स्थिति और उसके संचालन के कार्यान्वयन को परिभाषित करता है।
इसके विपरीत, एक ऑब्जेक्ट का प्रकार केवल अपने इंटरफेस को संदर्भित करता है-उन अनुरोधों का सेट, जिनके लिए वह प्रतिक्रिया दे सकता है।
मैं जावा का उपयोग करके एक उदाहरण प्रदान करना चाहता हूं:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
दोनों वर्गों A
और B
इंटरफ़ेस को लागू करने और इस प्रकार के हैं IType
। इसके अतिरिक्त जावा में, दोनों वर्ग अपने प्रकार (क्रमशः अपने वर्ग नाम) का उत्पादन करते हैं। इस प्रकार वर्ग A
प्रकार A
का है IType
और वर्ग B
प्रकार B
और IType
संतोषजनक है:
एक वस्तु के कई प्रकार हो सकते हैं, और विभिन्न वर्गों की वस्तुएँ एक ही प्रकार की हो सकती हैं।
उप-प्रकार और उप-वर्ग के बीच का अंतर संभवतः उस मुद्दे को समझने में मदद करता है:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
मैं एक प्रकार की चीजों के सेट के रूप में सोचता हूं जो आप किसी विशेष मूल्य के साथ कर सकते हैं। उदाहरण के लिए, यदि आपके पास पूर्णांक मान है, तो आप इसे अन्य पूर्णांकों में जोड़ सकते हैं (या अन्य अंकगणितीय संचालन कर सकते हैं), या इसे उन फ़ंक्शन से पास कर सकते हैं जो पूर्णांक तर्क को स्वीकार करते हैं। यदि आपके पास एक ऑब्जेक्ट वैल्यू है, तो आप उस पर तरीकों को कॉल कर सकते हैं जो उसके वर्ग द्वारा परिभाषित किए गए हैं।
क्योंकि एक वर्ग परिभाषित करता है कि आप उस वर्ग की वस्तुओं के साथ क्या कर सकते हैं, एक वर्ग एक प्रकार को परिभाषित करता है। एक वर्ग इससे अधिक है, हालांकि, यह इस बात का भी विवरण देता है कि तरीकों को कैसे लागू किया जाता है (प्रकार द्वारा निहित कुछ नहीं) और ऑब्जेक्ट के क्षेत्र कैसे निर्धारित किए जाते हैं।
यह भी ध्यान दें कि एक ऑब्जेक्ट वैल्यू में केवल एक वर्ग हो सकता है, लेकिन इसके कई प्रकार हो सकते हैं, क्योंकि प्रत्येक सुपरक्लास ऑब्जेक्ट की क्लास में उपलब्ध कार्यक्षमता का सबसेट प्रदान करता है।
इसलिए यद्यपि वस्तुएं और प्रकार निकटता से संबंधित हैं, वे वास्तव में एक ही चीज नहीं हैं।
C में टाइप, जैसे Int Float, char आदि ऐसे डेटा को परिभाषित करते हैं जिन पर विशिष्ट तरीकों से कार्य किया जा सकता है जो उन पर काम कर सकते हैं। यह उससे अधिक जटिल नहीं है। उदाहरण के लिए जैसे मैं जोड़ सकता हूं, गुणा कर सकता हूं और शायद विभाजित कर सकता हूं। इंट के लिए वे मेरे तरीके (या संचालन) हैं। ए क्लास केवल एक नए प्रकार की परिभाषा है। मैं पहले परिभाषित करता हूं कि डेटा कैसा दिखता है। शायद इसकी एक बिट है। हो सकता है कि यह एक वास्तविक और काल्पनिक भाग के साथ एक जटिल जैसे दो शब्द हों। या शायद 309734325 बाइट्स के साथ यह जटिल चीज बृहस्पति पर एक अजीब कण के परमाणु श्रृंगार का प्रतिनिधित्व करती है। मुझे परवाह नहीं है। पूर्णांक की तरह, मुझे इस नए डेटा प्रकार के साथ किए जाने वाले ऑपरेशन करने के लिए मिलता है। पूर्णांक के मामले में मैंने जो कुछ भी जोड़ा है, घटाना, आदि इस नए डेटा प्रकार के साथ मैं जो कुछ भी कार्य करता हूं उसे परिभाषित कर सकता हूं। उन्हें जोड़ घटाना आदि हो सकता है। लेकिन वे अन्य चीजें जोड़ सकते हैं। ये वे तरीके हैं जो मैं अपनी कक्षा में जोड़ने का फैसला करता हूं।
लब्बोलुआब यह है कि सी में एक प्रकार के साथ, आपके पास एक परिभाषा है कि डेटा क्या है, अर्थात; एक बाइट, शब्द, फ्लोट, चार आदि। लेकिन इनमें से किसी का भी तात्पर्य है कि कौन से ऑपरेशन कानूनी हैं और विश्वसनीय परिणाम देंगे।
इंटरफ़ेस और स्वीकार्य कार्यों को परिभाषित करने के लिए एक वर्ग अलग नहीं है। वर्ग इन चीजों को परिभाषित करता है और जब आप इसे एक वस्तु में बदल देते हैं तो यह वस्तु के व्यवहार को परिभाषित करता है जैसे एक प्रकार की परिभाषा पूर्णांक के व्यवहार को परिभाषित करती है जब आप उस पर काम करते हैं।
कक्षाएं आपको नए प्रकार और सब कुछ परिभाषित करने के लिए लचीलापन देती हैं कि वे कैसे काम करते हैं।
एक बार जब इसे परिभाषित किया जाता है, तो हर बार जब मैं क्लास "ऑब्जेक्टी" की एक वस्तु को त्वरित करता हूं, तो इसमें मेरे द्वारा परिभाषित डेटा संरचना और संचालन (विधियां) हैं जो मैंने कहा कि आप इसके साथ कर सकते हैं। वर्ग "बात" स्पष्ट रूप से एक नए प्रकार से अधिक या कम कुछ भी नहीं है जिसे C ++ मुझे परिभाषित करने देता है।
प्रकार आम तौर पर आदिम मूल्यों के वर्गीकरण को संदर्भित करता है - पूर्णांक, तार, सरणियां, बूलियन, अशक्त, आदि। आमतौर पर, आप कोई नया प्रकार नहीं बना सकते हैं।
क्लास उन संपत्तियों और विधियों के नामित सेट को संदर्भित करता है जो किसी वस्तु के निर्माण के साथ जुड़ा होता है। आप आमतौर पर जितनी चाहें उतनी नई कक्षाएं परिभाषित कर सकते हैं, हालांकि कुछ भाषाओं के लिए आपको एक नई वस्तु बनानी होगी और फिर इसके तरीकों को संलग्न करना होगा।
यह परिभाषा ज्यादातर सच है, लेकिन कुछ भाषाओं ने विभिन्न प्रकारों और वर्गों को विभिन्न तरीकों से संयोजित करने का प्रयास किया है, विभिन्न लाभकारी परिणाम हैं।
प्रकार और वर्ग संबंधित हैं लेकिन समान नहीं हैं। मेरा लेना यह है कि कक्षाएं कार्यान्वयन विरासत के लिए उपयोग की जाती हैं, जबकि प्रकार रनटाइम प्रतिस्थापन के लिए उपयोग किए जाते हैं।
यहां प्रतिस्थापन सिद्धांत को समझाते हुए एक लिंक दिया गया है और क्यों उपवर्ग और उपप्रकार हमेशा एक ही चीज नहीं हैं (उदाहरण के लिए जावा में)। विकिपीडिया सहप्रसरण और contravariance पर पेज इस तरह के अंतर के बारे में अधिक जानकारी नहीं है।
में सामान्य भाषा-नास्तिक भावना - कक्षा एक है प्राप्ति के प्रकार ।
अक्सर जब यह उस प्रकार का एकमात्र एहसास होता है, तो आप इसे किसी संदर्भ में संदर्भित करने के लिए दोनों शब्दों का उपयोग कर सकते हैं।
इसके विपरीत, उदाहरण के लिए, सी # संदर्भ में - कक्षा सिर्फ एक के कई और अधिक कार्यान्वयन एक के प्रकार की तरह पुरातन, structs, संकेत आदि अवधारणा
दिलचस्प सवाल। मुझे लगता है कि अकु का जवाब हाजिर है। ArrayList
एक उदाहरण के रूप में जावा वर्ग को लें
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
कहा जाता है कि कक्षा का एक उदाहरण प्रत्येक सुपरक्लास के प्रकार का होता है जो इसे विस्तारित करता है और प्रत्येक इंटरफ़ेस इसे लागू करता है। इसलिए, का एक उदाहरण ArrayList
वर्ग एक प्रकार है ArrayList
, RandomAccess
, Cloneable
, और इसके आगे। दूसरे शब्दों में, मान (या उदाहरण) एक या अधिक प्रकार के होते हैं, कक्षाएं परिभाषित करती हैं कि ये प्रकार क्या हैं।
विभिन्न वर्ग एक ही प्रकार का वर्णन कर सकते हैं।
प्रकार में ये भाग होते हैं:
कक्षा में ये भाग होते हैं:
कुछ नोट:
इंटरफ़ेस (जावा में) टाइप नहीं है, क्योंकि यह शब्दार्थ का वर्णन नहीं करता है (केवल वाक्यविन्यास का वर्णन करता है)
उप-वर्ग उप-प्रकार नहीं है, क्योंकि उप-वर्ग सुपरक्लास में परिभाषित शब्दार्थ को बदल सकता है, उप-प्रकार सुपर-टाइप शब्दार्थ को नहीं बदल सकता है (देखें Liskov प्रतिस्थापन सिद्धांत, उदाहरण के लिए यह एलएसपी उदाहरण )।
जाहिर है, वहाँ के रूप में है कि OO भाषाओं प्रोग्रामिंग नहीं कर रहे हैं प्रकार प्रणाली के साथ भाषाएं हैं, प्रकार की तुलना में एक व्यापक अवधारणा होना चाहिए वर्ग
जावा जैसी भाषाओं में भी, int
एक (आदिम) प्रकार है, लेकिन एक वर्ग नहीं है।
अत: प्रत्येक वर्ग एक प्रकार है, लेकिन प्रत्येक प्रकार एक वर्ग नहीं है।
यदि हम C # संदर्भ में इस प्रश्न पर विचार करते हैं, तो हम जवाब तक पहुँचते हैं।
C # प्रकार प्रणाली को निम्नलिखित श्रेणियों में विभाजित किया गया है:
मूल्य प्रकार:
संदर्भ प्रकार:
जैसा कि आप देख सकते हैं कि C # में कई प्रकार हैं जो क्लास उनमें से केवल एक है। बस एक महत्वपूर्ण नोट है: सी # प्रकार की प्रणाली ऐसी एकीकृत है कि किसी भी प्रकार के मूल्य को एक वस्तु के रूप में माना जा सकता है। C # में प्रत्येक प्रकार प्रत्यक्ष या अप्रत्यक्ष रूप से ऑब्जेक्ट क्लास प्रकार से निकलता है, और ऑब्जेक्ट सभी प्रकार का अंतिम आधार वर्ग है। संदर्भ प्रकारों का मान केवल ऑब्जेक्ट ऑब्जेक्ट के रूप में देखने से ऑब्जेक्ट के रूप में माना जाता है। मूल्य प्रकार के मूल्यों को बॉक्सिंग और अनबॉक्सिंग ऑपरेशन करके ऑब्जेक्ट के रूप में माना जाता है।
इसलिए जैसा कि मैं देखता हूं, टाइप कई वस्तुओं पर एक छतरी है, जो उनमें से एक है।
रेफ़रीसे: CSahrp लैंग्वेज स्पेसिफिकेशन डॉक, पृष्ठ 4
यह मेरे लिए एक अच्छा सवाल था, जिसने मुझे कठिन समझा। मैं यह कहने की हिम्मत करूंगा कि क्लास एक कंपाइलटाइम चीज़ है और टाइप रनटाइम चीज़ है। मैं ऐसा इसलिए कहता हूं क्योंकि आप क्लास लिखते हैं न कि टाइप। कंपाइलर तब वर्गों से प्रकार बनाता है, और रनटाइम वस्तुओं के उदाहरण बनाने के लिए प्रकारों का उपयोग करता है।