वर्ग (कंप्यूटर प्रोग्रामिंग)

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

जब क्लास के कंस्ट्रक्टर द्वारा कोई ऑब्जेक्ट बनाया जाता है, तो परिणामी ऑब्जेक्ट को क्लास का एक इंस्टेंस (कंप्यूटर साइंस) कहा जाता है, और ऑब्जेक्ट के लिए विशिष्ट सदस्य चर को उदाहरण चर कहा जाता है, क्लास भर में साझा किए गए वर्ग चर्स के विपरीत.

कुछ भाषाओं में, कक्षाएं, वास्तव में, केवल एक संकलन-समय की विशेषता हैं (रन-टाइम पर नई कक्षाएं घोषित नहीं की जा सकती हैं), जबकि अन्य भाषाओं में कक्षाएं प्रथम श्रेणी के नागरिक हैं, और आम तौर पर स्वयं ऑब्जेक्ट हैं (आमतौर पर प्रकार Class या इसी के समान)। इन भाषाओं में, एक वर्ग जो अपने भीतर कक्षाएं बनाता है उसे मेटाक्लास कहा जाता है।

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

वर्ग प्रकार आम तौर पर संज्ञाओं का प्रतिनिधित्व करते हैं, जैसे कि एक व्यक्ति, स्थान या चीज़, या कुछ नाममात्रीकरण, और एक वर्ग इनके कार्यान्वयन का प्रतिनिधित्व करता है। उदाहरण के लिए, ए Banana प्रकार सामान्य रूप से केले के गुणों और कार्यक्षमता का प्रतिनिधित्व कर सकता है, जबकि ABCBanana और XYZBanana कक्षाएं केले के उत्पादन के तरीकों का प्रतिनिधित्व करेंगी (जैसे, केले के आपूर्तिकर्ता या डेटा संरचनाएं और एक वीडियो गेम में केले का प्रतिनिधित्व करने और आकर्षित करने के लिए कार्य)। ABCBanana }} वर्ग तब विशेष केले का उत्पादन कर सकता है: के उदाहरण ABCBanana वर्ग प्रकार की वस्तुएं होंगी Banana. अक्सर एक प्रकार का केवल एक कार्यान्वयन दिया जाता है, इस मामले में वर्ग का नाम अक्सर प्रकार के नाम के समान होता है।

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

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

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

वर्ग इंटरफ़ेस की अवधारणा
प्रत्येक वर्ग #संरचना और व्यवहार प्रदान करके एक इंटरफ़ेस लागू करता है (या महसूस करता है)। संरचना में डेटा और राज्य होते हैं, और व्यवहार में कोड होते हैं जो निर्दिष्ट करते हैं कि विधियों को कैसे कार्यान्वित किया जाता है। एक अंतरफलक की परिभाषा और उस अंतरफलक के कार्यान्वयन के बीच अंतर है; हालाँकि, यह रेखा कई प्रोग्रामिंग भाषाओं में धुंधली है क्योंकि वर्ग घोषणाएँ एक इंटरफ़ेस को परिभाषित और कार्यान्वित करती हैं। हालाँकि, कुछ भाषाएँ ऐसी सुविधाएँ प्रदान करती हैं जो इंटरफ़ेस और कार्यान्वयन को अलग करती हैं। उदाहरण के लिए, एक #सार_और_कंक्रीट कार्यान्वयन प्रदान किए बिना एक इंटरफ़ेस को परिभाषित कर सकता है।

वर्ग वंशानुक्रम का समर्थन करने वाली भाषाएँ भी कक्षाओं को उन वर्गों से इंटरफेस प्राप्त करने की अनुमति देती हैं जिनसे वे प्राप्त हुए हैं।

उदाहरण के लिए, यदि कक्षा ए कक्षा बी से प्राप्त होती है और यदि कक्षा बी इंटरफ़ेस इंटरफ़ेस बी लागू करती है तो कक्षा ए इंटरफ़ेस बी द्वारा प्रदान की गई कार्यक्षमता (स्थिरांक और विधियों की घोषणा) को भी प्राप्त करती है।

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

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

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

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

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

सदस्य पहुंच
निम्नलिखित पहुँच विनिर्देशक का एक सामान्य सेट है:
 * प्राइवेट (या क्लास-प्राइवेट) क्लास तक ही पहुँच को प्रतिबंधित करता है। केवल वही विधियाँ जो एक ही वर्ग का हिस्सा हैं, निजी सदस्यों तक पहुँच सकती हैं।
 * संरक्षित (या वर्ग-संरक्षित) वर्ग को स्वयं और उसके सभी उपवर्गों को सदस्य तक पहुँचने की अनुमति देता है।
 * पब्लिक का मतलब है कि कोई भी कोड सदस्य को उसके नाम से एक्सेस कर सकता है।

हालाँकि कई ऑब्जेक्ट-ओरिएंटेड भाषाएँ उपरोक्त एक्सेस स्पेसिफायर का समर्थन करती हैं, उनके शब्दार्थ भिन्न हो सकते हैं।

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

एक्सेस विनिर्देशक आवश्यक रूप से दृश्यता को नियंत्रित नहीं करते हैं, इसमें निजी सदस्य भी क्लाइंट बाहरी कोड के लिए दृश्यमान हो सकते हैं। कुछ भाषाओं में, एक अप्राप्य लेकिन दृश्यमान सदस्य को रन-टाइम पर संदर्भित किया जा सकता है (उदाहरण के लिए, किसी सदस्य फ़ंक्शन से लौटाए गए सूचक द्वारा), लेकिन क्लाइंट कोड से सदस्य के नाम का संदर्भ देकर इसका उपयोग करने का प्रयास किया जाएगा टाइप चेकर द्वारा रोका गया। विभिन्न ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज सदस्य की पहुंच और दृश्यता को विभिन्न डिग्री तक लागू करती हैं, और भाषा के प्रकार सिस्टम और संकलन नीतियों के आधार पर, संकलन समय | कंपाइल-टाइम या रन टाइम (कार्यक्रम जीवनचक्र चरण) | रन-टाइम पर लागू होती हैं। उदाहरण के लिए, जावा (प्रोग्रामिंग भाषा) लैंग्वेज क्लाइंट कोड की अनुमति नहीं देती है जो किसी क्लास के निजी डेटा को कंपाइल करने के लिए एक्सेस करता है। सी ++ भाषा में, निजी तरीके दिखाई देते हैं, लेकिन इंटरफ़ेस में पहुंच योग्य नहीं हैं; हालाँकि, उन्हें पूरी तरह से अमूर्त वर्गों को स्पष्ट रूप से घोषित करके अदृश्य बनाया जा सकता है जो कक्षा के इंटरफेस का प्रतिनिधित्व करते हैं। कुछ भाषाओं में अन्य पहुँच-योग्यता योजनाएँ हैं:
 * इंस्टेंस बनाम क्लास एक्सेसिबिलिटी: रूबी (प्रोग्रामिंग भाषा) क्रमशः क्लास-प्राइवेट और क्लास-प्रोटेक्टेड के बदले इंस्टेंस-प्राइवेट और इंस्टेंस-प्रोटेक्टेड एक्सेस स्पेसिफायर का समर्थन करती है। वे इसमें भिन्न हैं कि वे उदाहरण के वर्ग के बजाय उदाहरण के आधार पर ही पहुंच को प्रतिबंधित करते हैं।
 * मित्र: सी ++ एक तंत्र का समर्थन करता है जहां स्पष्ट रूप से वर्ग के मित्र कार्य के रूप में घोषित एक फ़ंक्शन निजी या संरक्षित के रूप में नामित सदस्यों तक पहुंच सकता है।
 * पथ-आधारित: जावा एक जावा सिंटैक्स # एक्सेस संशोधक के भीतर एक सदस्य तक पहुंच को प्रतिबंधित करने का समर्थन करता है, जो फ़ाइल का तार्किक पथ है। हालाँकि, संरक्षित सदस्यों तक पहुँचने के लिए फ्रेमवर्क क्लास के समान पैकेज में कक्षाओं को लागू करने के लिए जावा फ्रेमवर्क का विस्तार करना एक सामान्य अभ्यास है। स्रोत फ़ाइल पूरी तरह से अलग स्थान पर मौजूद हो सकती है, और एक अलग .jar फ़ाइल में तैनात की जा सकती है, फिर भी जहाँ तक JVM का संबंध है, उसी तार्किक पथ में हो।

अंतर-वर्ग संबंध
स्टैंडअलोन कक्षाओं के डिजाइन के अलावा, प्रोग्रामिंग भाषाएं कक्षाओं के बीच संबंधों के आधार पर अधिक उन्नत वर्ग डिजाइन का समर्थन कर सकती हैं। आमतौर पर प्रदान की जाने वाली अंतर-श्रेणी संबंध डिजाइन क्षमताएं संरचनागत और श्रेणीबद्ध हैं।

रचना
कक्षाओं को अन्य वर्गों से बनाया जा सकता है, जिससे संलग्न वर्ग और उसके एम्बेडेड वर्गों के बीच एक रचनात्मक संबंध स्थापित किया जा सकता है। वर्गों के बीच रचनात्मक संबंध को आमतौर पर है-ए संबंध के रूप में भी जाना जाता है। उदाहरण के लिए, एक वर्ग कार से बना हो सकता है और इसमें एक वर्ग इंजन हो सकता है। इसलिए, एक कार में एक इंजन होता है। रचना का एक पहलू रोकथाम है, जो कि उनके पास मौजूद उदाहरण द्वारा घटक उदाहरणों का परिक्षेत्र है। यदि एक संलग्न वस्तु में मूल्य के अनुसार घटक उदाहरण होते हैं, तो घटक और उनके संलग्न वस्तु का एक समान वस्तु जीवनकाल होता है। यदि घटक संदर्भ द्वारा समाहित हैं, तो हो सकता है कि उनका जीवनकाल समान न हो। उदाहरण के लिए, ऑब्जेक्टिव-सी 2.0 में:

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @इंटरफेस कार: एनएसओब्जेक्ट

@property एनएसएसटींग * नाम; @ संपत्ति इंजन * इंजन @property NSArray *टायर;

@अंत 

यह Car वर्ग का एक उदाहरण है NSString (एक स्ट्रिंग (कंप्यूटर विज्ञान) वस्तु), Engine, और NSArray (एक सरणी वस्तु)।

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

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

उदाहरण (आईफोन एसडीके से सरलीकृत उद्देश्य-सी 2.0 कोड): <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @interface UIResponder: NSObject //... @interface UIView: UIResponder //... @interface UIScrollView: UIView //... @interface UITableView: UIScrollView //...  इस उदाहरण में, एक UITableView एक UIScrollView है एक UIView एक UIResponder एक NSObject है।

उपवर्ग की परिभाषाएँ
संकल्पनात्मक रूप से, एक सुपरक्लास अपने उपवर्गों का सुपरसेट है। उदाहरण के लिए, एक सामान्य वर्ग पदानुक्रम शामिल होगा GraphicObject के सुपरक्लास के रूप में Rectangle और Ellipse, जबकि Square का एक उपवर्ग होगा Rectangle. ये सभी समुच्चय सिद्धांत में भी उपसमुच्चय हैं, अर्थात, सभी वर्ग आयत हैं लेकिन सभी आयत वर्ग नहीं हैं।

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

वस्तु-उन्मुख मॉडलिंग में इस प्रकार के संबंध आमतौर पर ऑब्जेक्ट गुणों के रूप में तैयार किए जाते हैं। इस उदाहरण में, Car क्लास में एक संपत्ति होगी parts. parts वस्तुओं का एक संग्रह रखने के लिए टाइप किया जाएगा, जैसे कि उदाहरण Body, Engine, Tires, वगैरह। ऑब्जेक्ट मॉडलिंग लैंग्वेज जैसे कि यूनिफाइड मॉडलिंग लैंग्वेज में भाग और अन्य प्रकार के संबंधों के विभिन्न पहलुओं को मॉडल करने की क्षमता शामिल है - डेटा जैसे कि वस्तुओं की प्रमुखता, इनपुट और आउटपुट मूल्यों पर बाधाएं, आदि। इस जानकारी का उपयोग डेवलपर टूल द्वारा किया जा सकता है वस्तुओं के लिए मूल डेटा परिभाषाओं के साथ अतिरिक्त कोड उत्पन्न करें, जैसे कि म्यूटेटर विधि पर त्रुटि जाँच। ऑब्जेक्ट क्लास सिस्टम को मॉडलिंग और कार्यान्वित करते समय एक महत्वपूर्ण सवाल यह है कि क्या एक क्लास में एक या एक से अधिक सुपरक्लास हो सकते हैं। वास्तविक दुनिया में वास्तविक सेट के साथ ऐसा सेट मिलना दुर्लभ होगा जो एक से अधिक अन्य सेट के साथ नहीं मिला हो। हालाँकि, जबकि कुछ प्रणालियाँ जैसे फ्लेवर और सीएलओएस एक से अधिक माता-पिता को रन टाइम पर ऐसा करने की क्षमता प्रदान करते हैं, जटिलता का परिचय देते हैं कि ऑब्जेक्ट-ओरिएंटेड समुदाय में कई लोग पहली बार में ऑब्जेक्ट क्लास का उपयोग करने के लक्ष्यों के लिए विरोधाभासी मानते हैं। एक से अधिक सुपरक्लास के साथ काम करते समय यह समझना जटिल हो सकता है कि संदेश को संभालने के लिए कौन सी कक्षा जिम्मेदार होगी। यदि लापरवाही से उपयोग किया जाता है तो यह सुविधा उसी प्रणाली की कुछ जटिलताओं को पेश कर सकती है और अस्पष्टता वर्गों से बचने के लिए डिज़ाइन की गई थी। अधिकांश आधुनिक वस्तु-उन्मुख भाषाओं जैसे कि स्मॉलटाक और जावा को रन टाइम पर एकल वंशानुक्रम की आवश्यकता होती है। इन भाषाओं के लिए, एकाधिक विरासत मॉडलिंग के लिए उपयोगी हो सकती है लेकिन कार्यान्वयन के लिए नहीं।

हालाँकि, सेमांटिक वेब एप्लिकेशन ऑब्जेक्ट्स में कई सुपरक्लास होते हैं। इंटरनेट की अस्थिरता के लिए इस स्तर के लचीलेपन की आवश्यकता होती है और तकनीकी मानकों जैसे कि वेब ओन्टोलॉजी भाषा | वेब ओन्टोलॉजी लैंग्वेज (OWL) को इसका समर्थन करने के लिए डिज़ाइन किया गया है।

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

वर्ग अवधारणा और वंशानुक्रम की रूढ़िवादिता
हालाँकि वर्ग-आधारित भाषाओं को आमतौर पर वंशानुक्रम का समर्थन करने के लिए माना जाता है, वंशानुक्रम वर्गों की अवधारणा का एक आंतरिक पहलू नहीं है। कुछ भाषाएँ, जिन्हें अक्सर वस्तु-आधारित भाषाएँ कहा जाता है, कक्षाओं का समर्थन करती हैं, फिर भी वंशानुक्रम का समर्थन नहीं करती हैं। वस्तु-आधारित भाषाओं के उदाहरणों में मूल दृश्य के पुराने संस्करण शामिल हैं।

वस्तु-उन्मुख विश्लेषण के भीतर
वस्तु-उन्मुख विश्लेषण और डिजाइन|ऑब्जेक्ट-ओरिएंटेड एनालिसिस और एकीकृत मॉडलिंग भाषा में, दो वर्गों के बीच एक जुड़ाव कक्षाओं या उनके संबंधित उदाहरणों के बीच सहयोग का प्रतिनिधित्व करता है। संघों की दिशा है; उदाहरण के लिए, दो वर्गों के बीच एक द्वि-दिशात्मक जुड़ाव इंगित करता है कि दोनों वर्ग अपने संबंधों से अवगत हैं। संघों को उनके नाम या उद्देश्य के अनुसार लेबल किया जा सकता है। एक संघ की भूमिका को एक संघ का अंत दिया जाता है और संबंधित वर्ग की भूमिका का वर्णन करता है। उदाहरण के लिए, एक सब्सक्राइबर भूमिका उस तरीके का वर्णन करती है जिस तरह से क्लास पर्सन क्लास मैगज़ीन के साथ सब्स्क्राइबर्स-टू एसोसिएशन में भाग लेते हैं। साथ ही, एक पत्रिका की उसी संघ में सदस्यता वाली पत्रिका की भूमिका होती है। एसोसिएशन भूमिका बहुलता बताती है कि एसोसिएशन के अन्य वर्ग के प्रत्येक उदाहरण के कितने उदाहरण हैं। सामान्य गुणक 0..1, 1..1 , 1..* और 0..* हैं, जहां * किसी भी संख्या में उदाहरणों को निर्दिष्ट करता है।

वर्गों का वर्गीकरण
वर्गों की कई श्रेणियां हैं, जिनमें से कुछ ओवरलैप हैं।

<स्पैन क्लास = एंकर आईडी = एब्सट्रैक्ट_एंड_कंक्रीट_क्लासेस >  एब्सट्रैक्ट और कंक्रीट
विरासत का समर्थन करने वाली भाषा में, एक सार वर्ग, या सार आधार वर्ग (एबीसी), एक वर्ग है जिसे तत्काल नहीं किया जा सकता है क्योंकि इसे या तो सार के रूप में लेबल किया गया है या यह केवल अमूर्त विधियों (या 'वर्चुअल विधियों'') को निर्दिष्ट करता है। एक सार वर्ग कुछ विधियों का कार्यान्वयन प्रदान कर सकता है, और प्रकार के हस्ताक्षर के माध्यम से आभासी विधियों को भी निर्दिष्ट कर सकता है जो कि अमूर्त वर्ग के प्रत्यक्ष या अप्रत्यक्ष वंशजों द्वारा कार्यान्वित किया जाना है। इससे पहले कि एक अमूर्त वर्ग से प्राप्त एक वर्ग को तत्काल किया जा सके, उसके मूल वर्ग के सभी अमूर्त तरीकों को व्युत्पत्ति श्रृंखला में कुछ वर्ग द्वारा लागू किया जाना चाहिए। अधिकांश ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देती हैं कि किन वर्गों को अमूर्त माना जाता है और इन्हें तत्काल करने की अनुमति नहीं दी जाएगी। उदाहरण के लिए, Java (प्रोग्रामिंग लैंग्वेज), C Sharp (प्रोग्रामिंग लैंग्वेज)|C# और PHP में, कीवर्ड एब्स्ट्रैक्ट का उपयोग किया जाता है। सी ++ में, एक सार वर्ग एक वर्ग है जिसमें कम से कम एक अमूर्त विधि है जो उस भाषा में उचित सिंटैक्स द्वारा दी गई है (सी ++ पार्लेंस में एक शुद्ध वर्चुअल फ़ंक्शन)।

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

एक ठोस वर्ग एक ऐसा वर्ग है जो अमूर्त वर्गों के विपरीत तात्कालिकता (कंप्यूटर विज्ञान) हो सकता है, जो नहीं कर सकता।

स्थानीय और आंतरिक
कुछ भाषाओं में, कक्षाओं को वैश्विक दायरे के अलावा कार्यक्षेत्र (प्रोग्रामिंग) में घोषित किया जा सकता है। इस तरह के कई प्रकार के वर्ग हैं।

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

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

कॉमन लिस्प ऑब्जेक्ट सिस्टम (सीएलओएस) उन वर्गों और मेटाक्लासेस को लागू करने के लिए मेटाऑब्जेक्ट (एमओपी) प्रदान करता है।

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

वर्ग को घोषित करके एक गैर-उपवर्गीय वर्ग बनाया जाता है sealed सी # या के रूप में final जावा या PHP में।  उदाहरण के लिए, जावा  वर्ग को अंतिम के रूप में नामित किया गया है। गैर-उपवर्गीय वर्ग एक संकलक (संकलित भाषाओं में) को अनुकूलन करने की अनुमति दे सकते हैं जो उपवर्गीय वर्गों के लिए उपलब्ध नहीं हैं।

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

मिश्रण
कुछ भाषाओं में मिश्रणों के लिए विशेष समर्थन होता है, हालांकि किसी भी भाषा में एकाधिक वंशानुक्रम के साथ एक मिश्रण केवल एक वर्ग है जो एक प्रकार के संबंध का प्रतिनिधित्व नहीं करता है। mixin्स का उपयोग आमतौर पर एक ही तरीके को कई वर्गों में जोड़ने के लिए किया जाता है; उदाहरण के लिए, एक वर्ग UnicodeConversionMixin नामक विधि प्रदान कर सकता है unicode_to_ascii जब कक्षाओं में शामिल किया गया FileReader और WebPageScraper जो एक सामान्य माता-पिता को साझा नहीं करते हैं।

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

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

आंशिक वर्ग सुविधा के अन्य लाभों और प्रभावों में शामिल हैं:

स्मॉलटाक में क्लास एक्सटेंशन के नाम से आंशिक कक्षाएं काफी समय से मौजूद हैं। .NET Framework|.NET Framework 2 के आगमन के साथ, Microsoft ने C Sharp (प्रोग्रामिंग भाषा)|C# 2.0 और Visual Basic .NET दोनों में समर्थित आंशिक कक्षाओं की शुरुआत की। WinRT भी आंशिक कक्षाओं का समर्थन करता है।
 * एक वर्ग के इंटरफेस और कार्यान्वयन कोड को एक अनोखे तरीके से अलग करने में सक्षम बनाता है।
 * एक स्रोत कोड संपादक के भीतर बड़ी कक्षाओं के माध्यम से नेविगेशन को आसान बनाता है।
 * पहलू-उन्मुख प्रोग्रामिंग के समान, लेकिन बिना किसी अतिरिक्त टूल का उपयोग किए, चिंताओं को अलग करने में सक्षम बनाता है।
 * कई डेवलपर्स को बाद में एक फ़ाइल में अलग-अलग कोड मर्ज करने की आवश्यकता के बिना समवर्ती रूप से एक ही वर्ग पर काम करने में सक्षम बनाता है।

VB.NET में उदाहरण
विजुअल बेसिक .NET में लिखा गया यह सरल उदाहरण दिखाता है कि एक ही वर्ग के भागों को दो अलग-अलग फाइलों में कैसे परिभाषित किया जाता है। फ़ाइल1.वीबी: <वाक्यविन्यास लैंग = vbnet> आंशिक वर्ग MyClass निजी _नाम स्ट्रिंग के रूप में अंत वर्ग  फ़ाइल 2.वीबी: <वाक्यविन्यास लैंग = vbnet> आंशिक वर्ग MyClass सार्वजनिक रीडोनली संपत्ति का नाम स्ट्रिंग के रूप में पाना रिटर्न _नाम अंत प्राप्त करें संपत्ति समाप्त करें अंत वर्ग  संकलित होने पर, परिणाम वही होता है जैसे दो फाइलें एक के रूप में लिखी जाती हैं, जैसे: <वाक्यविन्यास लैंग = vbnet> क्लास माय क्लास निजी _नाम स्ट्रिंग के रूप में सार्वजनिक रीडोनली संपत्ति का नाम स्ट्रिंग के रूप में पाना रिटर्न _नाम अंत प्राप्त करें संपत्ति समाप्त करें अंत वर्ग 

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

फाउंडेशन में, हेडर फ़ाइल NSData.h: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @ इंटरफेस एनएसडीटा: एनएसओब्जेक्ट

- (आईडी) initWithContentsOfURL:(NSURL *)URL; //...

@अंत  उपयोगकर्ता द्वारा आपूर्ति की गई लाइब्रेरी में, फाउंडेशन फ्रेमवर्क से एक अलग बाइनरी, हेडर फाइल NSData+base64.h: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
 * 1) आयात <फाउंडेशन/फाउंडेशन.एच>

@ इंटरफेस एनएसडीटा (बेस 64)

- (एनएसएसटींग *) बेस 64 स्ट्रिंग; - (आईडी) initWithBase64String:(NSString *)base64String;

@अंत  और एक ऐप में, एक और अलग बाइनरी फ़ाइल, स्रोत कोड फ़ाइल main.m: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
 * 1) आयात <फाउंडेशन/फाउंडेशन.एच>
 * 2) import NSData+base64.h

इंट मेन (इंट एआरजीसी, चार * एआरजीवी []) {   अगर (एआरजीसी <2) वापसी EXIT_FAILURE; NSString *sourceURLString = [NSString stringWithCString:argv[1; एनएसडीटा * डेटा = एनएसडीटा आवंटन] initWithContentsOfURL: [NSURL URLWithString:sourceURLString; एनएसएलओजी (@% @, [डेटा बेस 64 स्ट्रिंग]); वापसी EXIT_SUCCESS; }  डिस्पैचर NSData इंस्टेंस पर बुलाए गए दोनों तरीकों को ढूंढेगा और दोनों को सही तरीके से इनवॉइस करेगा।

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

उदाहरण के लिए, सी # में, स्थिर चिह्नित वर्ग को तत्काल नहीं किया जा सकता है, केवल स्थिर सदस्य (फ़ील्ड, विधियों, अन्य) हो सकते हैं, हो सकता है कि 'इंस्टेंस कन्स्ट्रक्टर' न हो, और  मुहरबंद  हो।

अनाम
एक अनाम वर्ग या अनाम वर्ग एक ऐसा वर्ग है जो परिभाषा पर किसी नाम या पहचानकर्ता के लिए बाध्य नहीं है। यह नामांकित बनाम अज्ञात फ़ंक्शन के अनुरूप है।

लाभ
सॉफ़्टवेयर को वस्तु वर्गों में व्यवस्थित करने के लाभ तीन श्रेणियों में आते हैं:
 * त्वरित विकास
 * रखरखाव में आसानी
 * कोड और डिजाइन का पुन: उपयोग

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

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

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

उदाहरण के लिए, यदि मानव वर्ग व्यक्ति का प्रतिनिधित्व करने वाला एक मेटाऑब्जेक्ट है, तो मानव मेटाऑब्जेक्ट की सुविधाओं का उपयोग करके वर्ग व्यक्ति के उदाहरण बनाए जा सकते हैं।

यह भी देखें

 * कक्षा आधारित प्रोग्रामिंग
 * क्लास आरेख (यूएमएल)
 * वस्तु-उन्मुख प्रोग्रामिंग भाषाओं की सूची
 * मिक्सिन
 * ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
 * प्रोटोटाइप आधारित प्रोग्रामिंग
 * विशेषता (कंप्यूटर प्रोग्रामिंग)

अग्रिम पठन

 * Abadi; Cardelli: A Theory of Objects
 * ISO/IEC 14882:2003 Programming Language C++, International standard
 * Class Warfare: Classes vs. Prototypes, by Brian Foote
 * Meyer, B.: "Object-oriented software construction", 2nd edition, Prentice Hall, 1997, ISBN 0-13-629155-4
 * Rumbaugh et al.: "Object-oriented modeling and design", Prentice Hall, 1991, ISBN 0-13-630054-5