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

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

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

कुछ भाषाओं में, क्लासेस, वास्तव में, केवल एक संकलन-समय की विशेषता हैं (रन-टाइम पर नई क्लासेस घोषित नहीं की जा सकती हैं), जबकि अन्य भाषाओं में क्लासेस प्रथम श्रेणी के नागरिक हैं, और सामान्य रूप से स्वयं ऑब्जेक्ट हैं (सामान्य रूप से प्रकार 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