ऑब्जेक्ट-ओरिएंटेड दृष्टिकोनाची मूलभूत तत्त्वे. ओओपीची मूलभूत तत्त्वे आणि त्यांचा वापर

वारंवार विचारले जाणारे प्रश्न 26.07.2019
चेरचर

बहुतेक प्रकल्पांमध्ये ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगला प्राधान्य का दिले जाते? OOP त्यांच्या जटिलतेला सामोरे जाण्यासाठी एक प्रभावी मार्ग ऑफर करते. एक्झिक्युटेबल सूचनांचा क्रम म्हणून प्रोग्राम पाहण्याऐवजी, ते विशिष्ट गुणधर्मांसह ऑब्जेक्ट्सच्या गटाच्या रूपात त्याचे प्रतिनिधित्व करते आणि त्यावर विशिष्ट क्रिया करते. याचा परिणाम स्वच्छ, अधिक विश्वासार्ह आणि अधिक देखरेख करण्यायोग्य अनुप्रयोगांमध्ये होतो.

मूलभूत तत्त्वे उदयास आली कारण पूर्व-अस्तित्वात असलेल्या दृष्टिकोनांमध्ये मर्यादा शोधल्या गेल्या. त्यापैकी डेटामध्ये अमर्यादित प्रवेश आणि मोठ्या संख्येने कनेक्शन आहेत जे बदल करण्यावर निर्बंध लादतात. प्रोग्रामिंगमधील OOP म्हणजे काय आणि त्याचे फायदे काय हे समजून घेण्यासाठी त्यांची जागरूकता आणि कारणे महत्त्वाची आहेत.

प्रक्रियात्मक भाषा

C, Pascal, FORTRAN आणि तत्सम भाषा प्रक्रियात्मक आहेत. म्हणजेच, त्यांचे प्रत्येक ऑपरेटर संगणकाला काहीतरी करण्याचे आदेश देतात: डेटा प्राप्त करा, संख्या जोडा, सहाने विभाजित करा, परिणाम प्रदर्शित करा. प्रक्रियात्मक भाषेतील अनुप्रयोग म्हणजे सूचनांची सूची. जर ते लहान असेल तर, इतर कोणत्याही आयोजन तत्त्वाची (बहुतेकदा प्रतिमान म्हटले जाते) आवश्यक नसते. प्रोग्रामर सूचनांची यादी तयार करतो आणि संगणक त्या कार्यान्वित करतो.

फंक्शन्स मध्ये विभागणी

जसजसे अर्ज मोठे होतात, तसतशी यादी असह्य होते. काही लोकांना काही शंभरहून अधिक सूचना समजू शकतात जोपर्यंत ते एकत्र केले जात नाहीत. या कारणास्तव, हे वैशिष्ट्य ॲप्सना त्यांच्या निर्मात्यांसाठी अधिक समजण्यायोग्य बनवण्याचा एक मार्ग बनला आहे. काही भाषांमध्ये, समान संकल्पनेला सबरूटीन किंवा प्रक्रिया म्हटले जाऊ शकते.

अनुप्रयोग फंक्शन्समध्ये विभागलेला आहे, ज्यापैकी प्रत्येकाचा स्पष्टपणे परिभाषित उद्देश आणि इंटरफेस आहे.

विभागणी कार्यपद्धतीची कल्पना त्यांना मॉड्यूल नावाच्या मोठ्या ऑब्जेक्टमध्ये गटबद्ध करून वाढवता येते, परंतु तत्त्व समान आहे: घटकांचे गटबद्ध करणे जे सूचनांच्या सूची कार्यान्वित करतात.

फंक्शन्स आणि मॉड्युल्समध्ये विभागणी हे संरचित प्रोग्रामिंगच्या कोनशिलापैकी एक आहे, जे ओओपीच्या आगमनापूर्वी अनेक दशके प्रबळ प्रतिमान होते.

संरचित प्रोग्रामिंग समस्या

जसजसे ॲप्लिकेशन्स मोठे होत गेले, तसतसे संरचित प्रोग्रामिंगमध्ये संघर्ष होऊ लागला. प्रकल्प खूप गुंतागुंतीचे होत होते. वेळापत्रक बदलले. अधिक प्रोग्रामर सहभागी होते. गुंतागुंत वाढत गेली. खर्च गगनाला भिडले, वेळापत्रक पुढे सरकले आणि कोलमडले.

या अयशस्वी होण्याच्या कारणांच्या विश्लेषणाने प्रक्रियात्मक प्रतिमानातील कमतरता दर्शवल्या. संरचित प्रोग्रामिंग दृष्टीकोन कितीही चांगला अंमलात आणला गेला तरीही, मोठे अनुप्रयोग अती जटिल बनतात.

प्रक्रियात्मक भाषांशी संबंधित या समस्यांची कारणे काय आहेत? प्रथम, फंक्शन्सना जागतिक डेटामध्ये अमर्यादित प्रवेश असतो. दुसरे, असंबंधित कार्यपद्धती आणि मूल्ये वास्तविक जगाचे चांगले मॉडेल करत नाहीत.

इन्व्हेंटरी प्रोग्रामच्या संदर्भात या मुद्द्यांचा विचार करताना, सर्वात महत्वाच्या जागतिक डेटा घटकांपैकी एक म्हणजे अकाउंटिंग युनिट्सची लोकसंख्या. विविध फंक्शन्स नवीन मूल्य प्रविष्ट करण्यासाठी, ते प्रदर्शित करण्यासाठी, ते बदलण्यासाठी इत्यादींमध्ये प्रवेश करू शकतात.

अमर्यादित प्रवेश

लिखित प्रोग्राममध्ये, उदाहरणार्थ, C मध्ये, दोन प्रकारचे डेटा आहेत. स्थानिक लोक फंक्शनमध्ये लपलेले असतात आणि इतर प्रक्रियेद्वारे वापरले जात नाहीत.

जेव्हा दोन किंवा अधिक फंक्शन्सना समान डेटा ऍक्सेस करण्याची आवश्यकता असते, तेव्हा नंतरचे ग्लोबल असणे आवश्यक आहे. अशा, उदाहरणार्थ, खात्यात घेतलेल्या आयटमबद्दल माहिती आहे. जागतिक डेटा कोणत्याही प्रक्रियेद्वारे प्रवेश केला जाऊ शकतो.

मोठ्या प्रोग्राममध्ये अनेक कार्ये आणि अनेक जागतिक घटक असतात. प्रक्रियात्मक प्रतिमानाची समस्या अशी आहे की ते त्यांच्या दरम्यान आणखी संभाव्य कनेक्शन बनवते.

इतक्या मोठ्या संख्येने जोडण्यांमुळे अनेक अडचणी निर्माण होतात. प्रथम, प्रोग्रामची रचना समजून घेणे कठीण होते. दुसरे म्हणजे, बदल करणे कठीण होते. जागतिक डेटा आयटममधील बदलासाठी त्यात प्रवेश करणाऱ्या सर्व फंक्शन्समध्ये समायोजन आवश्यक असू शकते.

उदाहरणार्थ, अकाउंटिंग प्रोग्राममध्ये, एखादी व्यक्ती ठरवते की ज्या आयटमचा हिशोब केला जात आहे त्या कोडमध्ये 5 अंकांचा नसून 12 अंकांचा असावा. यासाठी लहान ते लांबपर्यंत बदलणे आवश्यक आहे. आता नवीन फॉरमॅटमध्ये काम करण्यासाठी कोड संबंधित फंक्शन्स बदलणे आवश्यक आहे.

जेव्हा घटक मोठ्या ऍप्लिकेशनमध्ये बदलतात, तेव्हा त्यांना कोणत्या प्रक्रियेत प्रवेश आहे हे सांगणे कठीण असते. परंतु हे जरी लक्षात आले असले तरी, ते बदलल्याने इतर जागतिक डेटाचे चुकीचे ऑपरेशन होऊ शकते. सर्व काही इतर सर्व गोष्टींशी जोडलेले आहे, म्हणून एका ठिकाणी बदल दुसऱ्या ठिकाणी पुनरावृत्ती होईल.

वास्तविक जग सिम्युलेशन

प्रक्रियात्मक प्रतिमानातील दुसरी आणि अधिक महत्त्वाची समस्या अशी आहे की वैयक्तिक डेटा आणि फंक्शन्सची त्याची मांडणी वास्तविक जगात गोष्टींचे चांगले मॉडेल करत नाही. येथे आम्ही लोक आणि कार यासारख्या वस्तूंशी व्यवहार करत आहोत. ते डेटा किंवा फंक्शन्ससारखे दिसत नाहीत. जटिल वास्तविक वस्तूंमध्ये गुणधर्म आणि वर्तन असते.

विशेषता

लोकांसाठी गुणधर्मांची उदाहरणे (कधीकधी वैशिष्ट्ये म्हणतात) म्हणजे डोळ्यांचा रंग आणि नोकरीचे शीर्षक आणि कारसाठी अश्वशक्ती आणि दरवाजांची संख्या. हे दिसून येते की, वास्तविक जगातील गुणधर्म प्रोग्राममधील डेटाच्या समतुल्य असतात. त्यांचे विशिष्ट अर्थ आहेत, जसे की निळा (डोळ्याचा रंग) किंवा चार (दारांची संख्या).

वागणूक

वर्तणूक म्हणजे वास्तविक जगातील वस्तू काही प्रकारच्या प्रभावाच्या प्रतिसादात निर्माण करतात. तुम्ही तुमच्या बॉसला पगारवाढीसाठी विचारल्यास, उत्तर "होय" किंवा "नाही" असे असेल. ब्रेक दाबल्यास गाडी थांबते. बोलणे आणि थांबणे ही वर्तनाची उदाहरणे आहेत. वर्तन हे एका कार्यपद्धतीसारखे असते: त्याला काहीतरी करण्यास म्हटले जाते आणि ते ते करते. अशा प्रकारे, डेटा आणि फंक्शन्स स्वतःच वास्तविक-जगातील वस्तूंचे मॉडेल प्रभावीपणे बनवत नाहीत.

समस्या सोडवणे

OOP मधील ऑब्जेक्ट डेटा आणि फंक्शन्सचा संग्रह म्हणून प्रस्तुत केला जातो. C++ मधील सदस्य फंक्शन्स म्हटल्या जाणाऱ्या कार्यपद्धतीच तुम्हाला त्याची मूल्ये पुनर्प्राप्त करण्याची परवानगी देतात. डेटा लपलेला आहे आणि बदलापासून संरक्षित आहे. मूल्ये आणि कार्ये एका संपूर्ण मध्ये अंतर्भूत आहेत. ओओ भाषांच्या वर्णनात एन्कॅप्सुलेशन आणि लपविणे या मुख्य संज्ञा आहेत.

जर तुम्हाला डेटा बदलायचा असेल, तर तुम्हाला माहित आहे की कोणती फंक्शन्स त्याच्याशी संवाद साधतात. इतर कोणतीही प्रक्रिया त्यांना प्रवेश करू शकत नाही. हे प्रोग्राम लिहिणे, डीबग करणे आणि देखभाल करणे सोपे करते.

ॲप्लिकेशनमध्ये सामान्यत: एकाधिक ऑब्जेक्ट्स असतात जे सदस्य फंक्शन्स कॉल करून एकमेकांशी संवाद साधतात.

आज सर्वात जास्त वापरले जाणारे प्रोग्रामिंग) C++ (प्लस-प्लस) आहे. Java मध्ये काही वैशिष्ट्यांचा अभाव आहे जसे की पॉइंटर्स, टेम्पलेट्स आणि एकाधिक वारसा, ज्यामुळे ते C++ पेक्षा कमी शक्तिशाली आणि बहुमुखी बनते. C# ने अद्याप C++ ची लोकप्रियता गाठलेली नाही.

हे लक्षात घेतले पाहिजे की C++ मधील तथाकथित सदस्य फंक्शन्सला Smalltalk सारख्या इतर काही ऑब्जेक्ट ओरिएंटेड भाषांमध्ये पद्धती म्हणतात. डेटा घटकांना विशेषता म्हणतात. ऑब्जेक्टवर मेथड कॉल करणे म्हणजे त्याला संदेश पाठवणे.

उपमा

आपण एखाद्या कंपनीचे विभाग म्हणून वस्तूंची कल्पना करू शकता. बऱ्याच संस्थांमध्ये, कर्मचारी एक दिवस एचआरमध्ये काम करत नाहीत, दुसऱ्या दिवशी पगार देतात आणि नंतर रिटेलमध्ये एक आठवडा घालवतात. प्रत्येक विभागाचे स्वतःचे कर्मचारी असतात ज्यात स्पष्टपणे नियुक्त केलेल्या जबाबदाऱ्या असतात. त्यांचे स्वतःचे डेटा देखील आहेत: वेतन निर्देशक, विक्री, कर्मचारी रेकॉर्ड इ. विभागातील लोक त्यांच्या स्वत: च्या माहितीसह कार्य करतात. अशा प्रकारे कंपनी विभक्त केल्याने तिच्या क्रियाकलापांचे निरीक्षण करणे आणि डेटा अखंडता राखणे सोपे होते. लेखा विभाग यासाठी जबाबदार आहे जर तुम्हाला दक्षिणेकडील शाखेत जुलैमध्ये दिलेली एकूण वेतनाची रक्कम जाणून घ्यायची असेल, तर अभिलेखागारात गोंधळ घालण्याची गरज नाही. जबाबदार व्यक्तीला एक नोट पाठवणे पुरेसे आहे, या व्यक्तीने डेटामध्ये प्रवेश मिळेपर्यंत प्रतीक्षा करा आणि आवश्यक माहितीसह प्रतिसाद पाठवा. हे नियमांचे पालन आणि बाहेरील हस्तक्षेपाची अनुपस्थिती सुनिश्चित करते. त्याच प्रकारे, OOP मधील ऑब्जेक्ट अनुप्रयोगासाठी संस्था प्रदान करते.

हे लक्षात ठेवले पाहिजे की ऑब्जेक्ट ओरिएंटेशन प्रोग्रामच्या ऑपरेशनच्या तपशीलांशी संबंधित नाही. बहुतेक C++ विधाने C सारख्या प्रक्रियात्मक भाषेतील ऑपरेटरशी संबंधित असतात. खरंच, C++ मधील सदस्य फंक्शन्स C मधील फंक्शन्स प्रमाणेच असतात. विधान प्रक्रियात्मक आहे की ऑब्जेक्ट-ओरिएंटेड आहे हे केवळ विस्तृत संदर्भ निर्धारित करेल.

OOP मधील ऑब्जेक्ट: व्याख्या

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

OOP मध्ये कोणत्या गोष्टी वस्तू बनतात? खाली विशिष्ट श्रेणी आहेत.

OOP मधील भौतिक वस्तू आहे:

  • प्रवाह मॉडेलमध्ये वाहतूक;
  • सर्किट डिझाइन प्रोग्राममधील इलेक्ट्रिकल घटक;
  • आर्थिक मॉडेलमधील देश;
  • हवाई वाहतूक नियंत्रण प्रणाली मध्ये विमान.

वापरकर्त्याच्या संगणक वातावरणातील घटक:

  • मेनू;
  • खिडक्या
  • ग्राफिक्स (रेषा, आयत, वर्तुळ);
  • कीबोर्ड, माउस, प्रिंटर, डिस्क ड्राइव्ह.
  • कामगार
  • विद्यार्थी;
  • ग्राहक;
  • विक्रेते
  • अकाउंटिंग बुक;
  • वैयक्तिक बाब;
  • शब्दकोश;
  • लोकसंख्या असलेल्या क्षेत्रांचे अक्षांश आणि रेखांश सारणी.

वास्तविक-जगातील वस्तू आणि OOP यांच्यातील कनेक्शन फंक्शन्स आणि डेटाच्या संयोजनाचा परिणाम होता: त्यांनी प्रोग्रामिंगमध्ये क्रांती केली. प्रक्रियात्मक भाषांमध्ये इतका जवळचा पत्रव्यवहार नाही.

वर्ग

OOP मधील ऑब्जेक्ट हे वर्गांचे सदस्य आहेत. याचा अर्थ काय? प्रोग्रामिंग भाषांमध्ये अंगभूत डेटा प्रकार असतात. प्रकार int, म्हणजे पूर्णांक, C++ मध्ये पूर्वनिर्धारित आहे. तुम्ही तुम्हाला हवे तितके int व्हेरिएबल्स घोषित करू शकता.

समान वर्गाच्या वस्तूंचा संच त्याच प्रकारे परिभाषित केला जातो. ते त्याच्या ऑब्जेक्ट्समध्ये समाविष्ट केलेल्या फंक्शन्स आणि डेटा तयार न करता परिभाषित करते, ज्याप्रमाणे int व्हेरिएबल्स तयार करत नाही.

OOP मधील वर्ग म्हणजे अनेक समान वस्तूंचे वर्णन. प्रिन्स, स्टिंग आणि मॅडोना हे गायक आहेत. या नावाचे कोणीही नाही, परंतु लोकांमध्ये योग्य वैशिष्ट्ये असल्यास त्यांना असे म्हटले जाऊ शकते. OOP ऑब्जेक्ट हे वर्गाचे उदाहरण आहे.

वारसा

जीवनात, वर्ग उपवर्गात विभागले जातात. उदाहरणार्थ, प्राणी उभयचर, सस्तन प्राणी, पक्षी, कीटक इत्यादींमध्ये विभागलेले आहेत.

या प्रकारच्या विभागणीचे तत्व असे आहे की प्रत्येक उपवर्गामध्ये तो ज्या वर्गातून खाली येतो त्या वर्गाची सामान्य वैशिष्ट्ये आहेत. सर्व कारमध्ये चाके आणि इंजिन असते. ही वाहनांची निश्चित वैशिष्ट्ये आहेत. सामान्य वैशिष्ट्यांव्यतिरिक्त, प्रत्येक उपवर्गाची स्वतःची वैशिष्ट्ये आहेत. बसेसमध्ये भरपूर आसनव्यवस्था असते आणि ट्रकमध्ये जड ओझे वाहून नेण्यासाठी जागा असते.

त्याचप्रमाणे, बेस क्लास हा अनेक व्युत्पन्न उपवर्गांचा पालक बनू शकतो, ज्यांना त्यांचे स्वतःचे जोडताना त्यांची वैशिष्ट्ये सामायिक करण्यासाठी परिभाषित केले जाऊ शकतात. इनहेरिटन्स हे एका फंक्शनसारखे आहे जे प्रक्रियात्मक कार्यक्रम सुलभ करते. जर कोडचे अनेक तुकडे जवळजवळ सारखेच करत असतील, तर तुम्ही सामान्य घटक काढू शकता आणि त्यांना एकाच प्रक्रियेत ठेवू शकता. ऍप्लिकेशनचे तीन क्षेत्र सामान्य क्रिया करण्यासाठी फंक्शन कॉल करू शकतात, परंतु ते त्यांचे स्वतःचे ऑपरेशन देखील करू शकतात. त्याचप्रमाणे, बेस क्लासमध्ये व्युत्पन्न वर्गांच्या गटासाठी सामान्य डेटा असतो. फंक्शन्सप्रमाणे, वारसा ऑब्जेक्ट-ओरिएंटेड प्रोग्राम लहान करतो आणि त्याच्या घटकांमधील संबंध स्पष्ट करतो.

पुन्हा वापरा

एकदा वर्ग तयार केल्यावर आणि डीबग केल्यानंतर, तो इतर प्रोग्रामरसह त्यांच्या स्वतःच्या अनुप्रयोगांमध्ये पुन्हा वापरण्यासाठी सामायिक केला जाऊ शकतो. हे फंक्शन्सच्या लायब्ररीसारखे आहे जे विविध अनुप्रयोगांमध्ये समाविष्ट केले जाऊ शकते.

OOP मध्ये, वारसा हा पुनर्वापराच्या कल्पनेचा विस्तार आहे. विद्यमान वर्गातून, ते न बदलता, तुम्ही इतर फंक्शन्सच्या व्यतिरिक्त एक नवीन तयार करू शकता. विद्यमान सॉफ्टवेअर पुन्हा वापरण्याची सुलभता हा OOP चा एक महत्त्वाचा फायदा आहे. यामुळे सुरुवातीच्या गुंतवणुकीवर वाढीव परतावा मिळेल असे मानले जाते.

नवीन डेटा प्रकार तयार करणे

नवीन डेटा प्रकार तयार करण्यासाठी ऑब्जेक्ट्स उपयुक्त आहेत. समजा प्रोग्राम द्विमितीय मूल्ये वापरत आहे (उदाहरणार्थ, समन्वय किंवा अक्षांश आणि रेखांश), आणि आपण अंकगणित ऑपरेशन्स वापरून त्यांच्यासह ऑपरेशन्स व्यक्त करू इच्छित आहात:

स्थिती1 = स्थिती + मूळ,

कोठे आणि मूळ स्वतंत्र संख्यात्मक मूल्यांच्या जोड्या आहेत. या दोन मूल्यांचा समावेश असलेला वर्ग तयार करणे आणि त्याचे व्हेरिएबल्स ऑब्जेक्ट्स म्हणून घोषित केल्याने एक नवीन डेटा प्रकार तयार होतो.

बहुरूपता, ओव्हरलोड

वरील स्थितीत्मक अंकगणितामध्ये वापरलेले = (समान) आणि + (प्लस) ऑपरेटर इंट सारख्या अंगभूत प्रकारांप्रमाणे कार्य करत नाहीत. पोझिशन ऑब्जेक्ट्स इ. पूर्वनिर्धारित नसतात, परंतु प्रोग्रामॅटिकरित्या परिभाषित केले जातात. त्यांना कसे हाताळायचे हे या ऑपरेटरना कसे कळते? उत्तर असे आहे की त्यांना नवीन वागणूक नमुने नियुक्त केले जाऊ शकतात. ही ऑपरेशन्स पोझिशन क्लासची सदस्य कार्ये असतील.

ऑपरेटर किंवा कार्यपद्धती ते कशावर चालतात यावर अवलंबून असलेल्या वापरास पॉलिमॉर्फिझम म्हणतात. जेव्हा विद्यमान ऑपरेटर जसे की + किंवा = ला नवीन डेटा प्रकारासह कार्य करण्याची क्षमता दिली जाते, तेव्हा ते ओव्हरलोड असल्याचे म्हटले जाते. ओओपीमध्ये ओव्हरलोडिंग हा एक प्रकारचा पॉलिमॉर्फिझम आहे. हे त्याचे महत्त्वाचे वैशिष्ट्य आहे.

OOP "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग फॉर डमीज" बद्दलचे पुस्तक प्रत्येकाला या विषयाशी अधिक तपशीलवार परिचित होण्यास अनुमती देईल.

सामान्य माहिती

ओओपी ही एक प्रोग्रामिंग शैली आहे जी 20 व्या शतकाच्या 80 च्या दशकात दिसून आली. प्रक्रियात्मक भाषेच्या विपरीत, जिथे डेटा आणि त्यावर प्रक्रिया करण्यासाठी सूचना स्वतंत्रपणे अस्तित्वात आहेत, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगमध्ये ही माहिती एका घटकामध्ये एकत्रित केली जाते.

OOP ची मूलभूत तत्त्वे

वारसा

OOP चे दुसरे तत्व, वारसा, एका वर्गाची दुसऱ्या वर्गाची पद्धत त्यांच्या प्रत्यक्ष अंमलबजावणीची पुनरावृत्ती न करता वापरण्याची क्षमता आहे. वारसा आपल्याला स्त्रोत कोडमधील रिडंडंसीपासून मुक्त होण्यास अनुमती देते.

बहुरूपता

OOP चे आणखी एक तत्व म्हणजे पॉलिमॉर्फिझम. त्याच्या वापराचा अर्थ असा आहे की विविध प्रकारच्या जटिलतेच्या वस्तू हाताळण्यासाठी, आपण एक इंटरफेस तयार करू शकता जो इव्हेंटवर भिन्न प्रतिक्रिया देईल आणि त्याच वेळी नियुक्त केलेल्या कार्यांची योग्यरित्या अंमलबजावणी करेल.

OOP भाषा

C++ आणि Java सारख्या सर्वात लोकप्रिय प्रोग्रामिंग भाषांमध्ये OOP तत्त्वे वापरली जातात, ज्यामध्ये प्रोग्राम आणि ऍप्लिकेशन्सचा महत्त्वपूर्ण भाग विकसित केला जातो. कमी वापरल्या जाणाऱ्या ओओपी भाषा देखील आहेत - डेल्फी, ऑब्जेक्ट पास्कल, रुबी आणि इतर अनेक.

OOP ची टीका

या पद्धतीबद्दल बहुतेक सकारात्मक विधाने असूनही, OOP च्या तत्त्वांवर अनेकदा टीका केली जाते. OOP प्रमाणे, त्याचेही तोटे आहेत.

प्रथम, संक्रमणाची अडचण. OOP ची तत्त्वे समजण्यास बराच वेळ लागेल, विशेषत: अशा लोकांसाठी जे केवळ प्रक्रियात्मक प्रोग्रामिंग भाषांसह जवळून काम करतात.

दुसरे म्हणजे, गैरसोय अधिक जटिल दस्तऐवजीकरण आहे, कारण केवळ वर्ग आणि वस्तूंचे वर्णन करणे आवश्यक नाही तर त्यांच्या अंमलबजावणीच्या विशिष्ट प्रकरणांची देखील आवश्यकता असेल.

तिसरे म्हणजे, पद्धतींच्या अत्यधिक सार्वत्रिकतेमुळे स्त्रोत कोड आणि विकसित प्रोग्राम्स या विशिष्ट प्रकरणात मागणी नसलेल्या फंक्शन्स आणि क्षमतांनी ओव्हरलोड केले जातील. याव्यतिरिक्त, ते मेमरी वाटपाच्या बाबतीत अकार्यक्षमता लक्षात घेतात. तथापि, इतरांच्या मतांची पर्वा न करता, ओओपी प्रोग्रामरची संख्या सतत वाढत आहे आणि भाषा स्वतःच वेगाने विकसित होत आहेत.

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगची मूलभूत तत्त्वे

सर्व ऑब्जेक्ट-आधारित भाषांनी (C#, Java, C++, Smalltalk, Visual Basic, इ.) ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) च्या तीन मूलभूत तत्त्वांचे पालन केले पाहिजे, जे खाली सूचीबद्ध आहेत:

एन्कॅप्सुलेशन

ही भाषा वस्तूंचे अंतर्गत अंमलबजावणी तपशील कसे लपवते आणि डेटा अखंडतेचे संरक्षण कसे करते?

वारसा

ही भाषा कोडच्या पुनर्वापराला कसे प्रोत्साहन देते?

बहुरूपता

दिलेली भाषा संबंधित वस्तूंना अशाच प्रकारे हाताळण्याची परवानगी कशी देते?

प्रत्येक तत्त्वाच्या अंमलबजावणीच्या वाक्यरचनात्मक तपशीलांमध्ये जाण्यापूर्वी, प्रत्येकाची मूलभूत भूमिका समजून घेणे महत्त्वाचे आहे.

एन्कॅप्सुलेशनची भूमिका

एन्कॅप्सुलेशनही एक प्रोग्रामिंग यंत्रणा आहे जी कोड आणि डेटामध्ये फेरफार करून एकत्र आणते, बाहेरील हस्तक्षेप आणि डेटाचा गैरवापर दोन्ही दूर करते. ऑब्जेक्ट-ओरिएंटेड भाषेत, डेटा आणि कोड पूर्णपणे स्वयं-निहित ब्लॅक बॉक्समध्ये एकत्र केले जाऊ शकतात. अशा बॉक्समध्ये सर्व आवश्यक डेटा आणि कोड असतो. जेव्हा कोड आणि डेटा अशा प्रकारे एकत्र जोडला जातो तेव्हा एक ऑब्जेक्ट तयार होतो. दुसऱ्या शब्दांत, वस्तूएन्कॅप्युलेशनला समर्थन देणारा घटक आहे.

त्या. एन्कॅप्स्युलेशन म्हणजे एखाद्या ऑब्जेक्टच्या वापरकर्त्याकडून अनावश्यक अंमलबजावणी तपशील लपविण्याची भाषेची क्षमता. उदाहरणार्थ, समजा तुम्ही नावाचा क्लास वापरत आहात डेटाबेस रीडर, ज्यामध्ये दोन मुख्य पद्धती आहेत: Open() आणि Close().

डमी DatabaseReader वर्ग डेटा फाइल शोधणे, लोड करणे, हाताळणी करणे आणि बंद करणे यासंबंधी अंतर्गत तपशील समाविष्ट करतो. प्रोग्रॅमर्सना एन्कॅप्स्युलेशन आवडते कारण ते एक ओओपी तत्व आहे. कोडिंग सोपे करते. DatabaseReader वर्ग कार्य करण्यासाठी पडद्यामागे काम करणाऱ्या कोडच्या असंख्य ओळींबद्दल काळजी करण्याची गरज नाही. फक्त एक उदाहरण तयार करणे आणि त्यास योग्य संदेश पाठवणे आवश्यक आहे (उदाहरणार्थ, "C: ड्राइव्हवर स्थित AutoLot.mdf नावाची फाइल उघडा").

प्रोग्राम लॉजिक एन्कॅप्स्युलेट करण्याच्या कल्पनेशी जवळून संबंधित आहे डेटा संरक्षणाची कल्पना. आदर्शपणे, ऑब्जेक्ट स्टेट डेटा कीवर्ड वापरून निर्दिष्ट केला पाहिजे खाजगी(किंवा कदाचित संरक्षित). अशाप्रकारे, बाह्य जगाला अंतर्निहित अर्थ बदलायचा आहे किंवा प्राप्त करायचा आहे का ते नम्रपणे विचारले पाहिजे. हे एक चांगले तत्व आहे कारण सार्वजनिक डेटा घटक सहजपणे दूषित होऊ शकतात (अगदी चुकून, हेतुपुरस्सर नाही).

C# मध्ये encapsulation चे मूलभूत एकक आहे वर्ग, जे ऑब्जेक्टचा आकार परिभाषित करते. हे डेटाचे वर्णन करते, तसेच त्यावर कार्य करणार्या कोडचे वर्णन करते. C# मध्ये, क्लासची उदाहरणे असलेल्या वस्तू तयार करण्यासाठी क्लास डिक्लेरेशनचा वापर केला जातो. म्हणून, वर्ग हा मूलत: ऑब्जेक्ट कसा बांधला जातो याच्या योजनाबद्ध वर्णनांची मालिका आहे.

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

वारसाची भूमिका

OOP चे पुढील तत्व आहे वारसा- विद्यमान वर्गांच्या व्याख्यांवर आधारित नवीन वर्ग व्याख्या तयार करण्यास परवानगी देण्याच्या भाषेच्या क्षमतेशी संबंधित आहे. मूलत:, वारसा तुम्हाला मूळ (किंवा पालक) वर्गाचे वर्तन वाढवण्यास अनुमती देते व्युत्पन्न उपवर्ग (ज्याला चाइल्ड क्लास देखील म्हटले जाते):

त्या. वारसा ही प्रक्रिया आहे ज्याद्वारे एक ऑब्जेक्ट दुसर्या ऑब्जेक्टचे गुणधर्म प्राप्त करतो. ही एक अतिशय महत्त्वाची प्रक्रिया आहे कारण ती श्रेणीबद्ध वर्गीकरणाचे तत्त्व प्रदान करते. आपण याबद्दल विचार केल्यास, बहुतेक ज्ञान श्रेणीबद्ध, उतरत्या वर्गीकरणाद्वारे व्यवस्थित केले जाऊ शकते.

आपण पदानुक्रम वापरला नसल्यास, प्रत्येक ऑब्जेक्टसाठी आपल्याला त्याचे सर्व गुणधर्म स्पष्टपणे परिभाषित करावे लागतील. आणि जर आपण वारसा वापरत असाल, तर केवळ त्या गुणधर्मांची व्याख्या करणे पुरेसे आहे जे एखाद्या वस्तूला त्याच्या वर्गात विशेष बनवतात. हे त्याच्या पालकांच्या सामान्य गुणधर्मांचा वारसा देखील घेऊ शकते. म्हणून, वारसा पद्धतीद्वारे, एक वस्तू अधिक सामान्य वर्गाचे एक वेगळे उदाहरण बनते.

पॉलिमॉर्फिझमची भूमिका

OOP चे शेवटचे तत्व आहे बहुरूपता. हे संबंधित वस्तूंना समान पद्धतीने हाताळण्याची भाषेची क्षमता दर्शवते. विशेषतः, हे OOP तत्त्व बेस क्लासला सदस्यांच्या संचाची व्याख्या करण्यास अनुमती देते (औपचारिकपणे म्हणतात पॉलिमॉर्फिक इंटरफेस), जे सर्व वारसांसाठी उपलब्ध आहेत. पॉलीमॉर्फिक क्लास इंटरफेस कितीही आभासी किंवा अमूर्त सदस्य वापरून तयार केला जातो.

मूलत:, व्हर्च्युअल सदस्य हा बेस क्लासचा सदस्य असतो जो डीफॉल्ट अंमलबजावणी परिभाषित करतो जो व्युत्पन्न वर्गामध्ये बदलला जाऊ शकतो (किंवा, अधिक औपचारिकपणे, अधिलिखित केले जाऊ शकते). याउलट, अमूर्त पद्धत ही बेस क्लासची सदस्य आहे जी डीफॉल्ट अंमलबजावणी प्रदान करत नाही तर फक्त स्वाक्षरी देते. जेव्हा अमूर्त पद्धत परिभाषित करणाऱ्या बेस क्लासमधून वर्ग वारसा घेतो, तेव्हा ती पद्धत व्युत्पन्न वर्गात अधिलिखित करणे आवश्यक आहे. कोणत्याही परिस्थितीत, जेव्हा व्युत्पन्न वर्ग बेस क्लासमध्ये परिभाषित सदस्यांना ओव्हरराइड करतात, तेव्हा ते मूलत: त्याच विनंतीला त्यांचा प्रतिसाद ओव्हरराइड करत असतात.


2. "वर्ग" ची संकल्पना परिभाषित करा.
3. वर्ग फील्ड/विशेषता म्हणजे काय?
4. वर्ग फील्डमध्ये प्रवेश कसा व्यवस्थित करावा?
5. "कन्स्ट्रक्टर" ची संकल्पना परिभाषित करा.
6. डीफॉल्ट, कॉपी आणि पॅरामीटर कन्स्ट्रक्टरमध्ये काय फरक आहे?
7. प्रवेश पातळीचे कोणते बदल तुम्हाला माहीत आहेत, त्या प्रत्येकाबद्दल आम्हाला सांगा.
8. एकल खाजगी कन्स्ट्रक्टर असलेल्या वर्गाच्या वैशिष्ट्यांबद्दल आम्हाला सांगा.
9. “हा”, “सुपर” या कीवर्डचा अर्थ काय आहे, ते कुठे आणि कसे वापरले जाऊ शकतात?
10. "पद्धती" ची संकल्पना परिभाषित करा.
11. पद्धत स्वाक्षरी म्हणजे काय?
12. कोणत्या पद्धतींना ओव्हरलोड म्हणतात?
13. नॉन-स्टॅटिक पद्धती स्थिर पद्धतींना ओव्हरलोड करू शकतात?
14. पद्धत ओव्हरराइडिंगबद्दल आम्हाला सांगा.
15. एखादी पद्धत भिन्न संख्येची पॅरामीटर्स घेऊ शकते (व्हेरिएबल लांबीचे युक्तिवाद)?
16. पद्धत ओव्हरराइड करताना ऍक्सेस लेव्हल/रिटर्न प्रकार कमी करणे शक्य आहे का?
17. पालक वर्गाच्या अधिलिखित पद्धतींमध्ये प्रवेश कसा करायचा?
18. खालील आणि वरच्या दिशेने कोणते परिवर्तन म्हणतात?
19. ओव्हरराइडिंग आणि ओव्हरलोडिंगमध्ये काय फरक आहे?
20. मी स्टॅटिक/नॉन-स्टॅटिक फील्ड कुठे सुरू करू शकतो?

21. ऑपरेटरची उदाहरणे का आवश्यक आहेत?
22. इनिशिएलायझेशन ब्लॉक्सची गरज का आहे आणि ते काय आहेत?
23. दोन वर्गांचे कन्स्ट्रक्टर आणि इनिशिएलायझेशन ब्लॉक्स कॉल करण्याचा क्रम काय आहे: एक वंशज आणि त्याचे पूर्वज?
24. ॲबस्ट्रॅक्ट मॉडिफायर कुठे आणि कशासाठी वापरला जातो?
25. एकाच वेळी पद्धत अमूर्त आणि स्थिर घोषित करणे शक्य आहे का?
26. स्थिर कीवर्डचा अर्थ काय आहे?
27. स्टॅटिक मॉडिफायर कोणत्या Java रचनांना लागू होतो?
28. कोडच्या स्थिर ब्लॉकमध्ये अपवाद आढळल्यास काय होईल?
29. स्थिर पद्धत ओव्हरलोड करणे शक्य आहे का?
30. एक स्थिर वर्ग काय आहे, त्याच्या वापराची वैशिष्ट्ये काय आहेत?
31. फायनल स्टॅटिक व्हेरिएबल्स सुरू करण्याची वैशिष्ट्ये कोणती आहेत?
32. स्टॅटिक मॉडिफायरचा वर्ग/पद्धत/फील्डवर कसा परिणाम होतो?
33. अंतिम कीवर्डचा अर्थ काय आहे?
34. "इंटरफेस" ची संकल्पना परिभाषित करा.
35. फील्ड आणि इंटरफेस पद्धतींमध्ये डीफॉल्टनुसार कोणते सुधारक असतात?
36. तुम्ही अंतिम किंवा स्टॅटिक मॉडिफायरसह इंटरफेस पद्धत का घोषित करू शकत नाही?
37. जावामध्ये कोणत्या प्रकारचे वर्ग आहेत (नेस्टेड... इ.)
38. नेस्टेड वर्ग तयार करण्याची वैशिष्ट्ये काय आहेत: साधे आणि स्थिर.
39. नेस्टेड क्लासेसबद्दल तुम्हाला काय माहिती आहे, ते का वापरले जातात? वर्गीकरण, वापर प्रकरणे, encapsulation उल्लंघन.
40. नेस्टेड आणि इनर क्लासेसमध्ये काय फरक आहे?
41. कोणत्या वर्गांना अनामिक म्हणतात?
42. नेस्टेड क्लासमधून बाह्य वर्गाच्या फील्डमध्ये प्रवेश कसा करायचा?

43. या पद्धतीच्या मुख्य भागामध्ये घोषित केलेल्या अनामिक वर्गातून तुम्ही पद्धतीचे स्थानिक व्हेरिएबल कसे मिळवू शकता? अशा व्हेरिएबलसाठी काही निर्बंध आहेत का?
44. कोणताही वापरकर्ता वर्ग ऑब्जेक्ट वर्गाशी कसा संबंधित आहे?
45. ऑब्जेक्ट क्लासच्या प्रत्येक पद्धतीचे स्पष्टीकरण द्या.
46. ​​equals() पद्धत काय आहे. हे == ऑपरेशनपेक्षा वेगळे कसे आहे.
47. जर तुम्हाला equals() ओव्हरराइड करायचे असेल, तर ओव्हरराइड केलेल्या पद्धतीसाठी कोणत्या अटी पूर्ण केल्या पाहिजेत?
48. जर equals() ओव्हरराइड केले असेल, तर ओव्हरराइड करण्याच्या इतर पद्धती आहेत का?
49. हॅशकोड आणि इक्वल्स पद्धतींमध्ये काय विशेष आहे? ऑब्जेक्ट क्लासमध्ये हॅशकोड आणि इक्वल्स पद्धती कशा लागू केल्या जातात? या पद्धती लागू करण्यासाठी कोणते नियम आणि नियम अस्तित्वात आहेत? ते कधी वापरले जातात?
50. कोणती पद्धत ऑब्जेक्टचे स्ट्रिंग प्रतिनिधित्व देते?
51. हॅशकोड ओव्हरराइड न करता तुम्ही समान ओव्हरराइड केल्यास काय होईल? कोणत्या समस्या उद्भवू शकतात?
52. हॅशकोडची गणना करताना कोणती फील्ड वापरली जावी याबद्दल काही शिफारसी आहेत का?
53. हॅशमॅपमध्ये की म्हणून वापरल्या जाणाऱ्या ऑब्जेक्टने हॅशकोड ठरवण्यात गुंतलेली फील्ड बदलल्यास काही समस्या असतील असे तुम्हाला वाटते का?
54. इंटरफेसपेक्षा अमूर्त वर्ग कसा वेगळा आहे?
55. खाजगी क्लास व्हेरिएबल्समध्ये प्रवेश करणे शक्य आहे का आणि असल्यास, कसे?
56. अस्थिर आणि क्षणिक काय आहेत? कशासाठी आणि कोणत्या प्रकरणांमध्ये डीफॉल्ट वापरला जाऊ शकतो?
57. वारसा, ओव्हरराइडिंग आणि लपविण्याच्या पद्धती दरम्यान सुधारकांचा विस्तार करणे. पालक वर्गात खाजगी घोषित केलेली पद्धत असल्यास, वंशज तिची दृश्यमानता वाढवू शकतात? संरक्षित असल्यास काय? दृश्यमानता कमी करण्याबद्दल काय?
58. खाजगी पद्धत अंतिम घोषित करण्यात अर्थ आहे का?
59. फायनल व्हेरिएबल्स इनिशिएलायझिंगची वैशिष्ट्ये कोणती आहेत?
60. जर वर्गाचा एकमात्र कन्स्ट्रक्टर अंतिम घोषित केला गेला तर काय होईल?
61. अंतिम म्हणजे काय? त्याची गरज का आहे? कचरा गोळा करणारे आणि त्याच्या अल्गोरिदमबद्दल तुम्ही आम्हाला काय सांगू शकता?
62. क्लोन पद्धत संरक्षित का घोषित केली जाते? क्लोनिंग लागू करण्यासाठी काय आवश्यक आहे?

उत्तरे. भाग १

1. OOP च्या तत्त्वांची नावे सांगा आणि प्रत्येकाबद्दल आम्हाला सांगा.

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) ही एक प्रोग्रामिंग पद्धत आहे जी ऑब्जेक्ट्सच्या संग्रहाच्या रूपात प्रोग्रामचे प्रतिनिधित्व करते, त्यातील प्रत्येक विशिष्ट वर्गाचा एक उदाहरण आहे आणि वर्ग एक वारसा पदानुक्रम तयार करतात.

OOP ची मूलभूत तत्त्वे: अमूर्तता, encapsulation, वारसा, बहुरूपता.

अमूर्त- म्हणजे महत्त्वाची माहिती हायलाइट करणे आणि क्षुल्लक माहिती विचारातून वगळणे. प्रोग्रामिंगच्या दृष्टिकोनातून, हे ऑब्जेक्ट्समध्ये प्रोग्रामचे योग्य विभाजन आहे. ॲब्स्ट्रॅक्शन तुम्हाला मुख्य वैशिष्ट्ये निवडण्याची आणि दुय्यम वगळण्याची परवानगी देते.

उदाहरण: कंपनीतील पदांचे वर्णन. येथे पदाचे शीर्षक महत्त्वपूर्ण माहिती आहे आणि प्रत्येक पदाच्या जबाबदाऱ्यांचे वर्णन ही दुय्यम माहिती आहे. उदाहरणार्थ, "संचालक" चे मुख्य वैशिष्ट्य हे असेल की ही स्थिती काहीतरी व्यवस्थापित करते आणि नेमके काय (एचआर संचालक, आर्थिक संचालक, कार्यकारी संचालक) ही दुय्यम माहिती आहे.

एन्कॅप्सुलेशन- एक सिस्टम गुणधर्म जी तुम्हाला डेटा आणि त्यांच्यासह कार्य करणाऱ्या पद्धती वर्गात एकत्रित करण्याची परवानगी देते. Java साठी, encapsulation "अंमलबजावणी लपवत आहे" असे म्हणणे योग्य होईल. आयुष्यातील एक उदाहरण म्हणजे टीव्ही रिमोट कंट्रोल. आम्ही "व्हॉल्यूम वाढवा" बटण दाबतो आणि ते वाढते, परंतु या क्षणी डझनभर प्रक्रिया घडतात ज्या आमच्यापासून लपलेल्या असतात. Java साठी: तुम्ही 10 पद्धतींसह वर्ग तयार करू शकता, उदाहरणार्थ, जे जटिल आकृतीचे क्षेत्रफळ मोजतात, परंतु त्यापैकी 9 खाजगी करतात. 10 व्या पद्धतीला “calculateArea()” असे संबोधले जाईल आणि सार्वजनिक घोषित केले जाईल आणि त्यामध्ये वापरकर्त्यापासून लपवलेल्या आवश्यक पद्धती कॉल केल्या जातील. हे वापरकर्ता कॉल करेल.

वारसा- एक सिस्टीम गुणधर्म जी तुम्हाला अंशतः किंवा पूर्णपणे उधार घेतलेल्या कार्यक्षमतेसह विद्यमान वर्गावर आधारित नवीन वर्गाचे वर्णन करण्यास अनुमती देते. ज्या वर्गातून वारसा घेतला जातो त्याला आधार, पालक किंवा सुपरक्लास म्हणतात. नवीन वर्ग म्हणजे वंशज, वारस, मूल किंवा व्युत्पन्न वर्ग.

बहुरूपता- ऑब्जेक्टचा प्रकार आणि अंतर्गत संरचनेबद्दल माहिती न देता समान इंटरफेससह ऑब्जेक्ट्स वापरण्याची सिस्टमची क्षमता. जावा मधील थिंकिंग मधील उदाहरण (किंचित सुधारित):

सार्वजनिक इंटरफेस आकार ( void draw(); void erase(); ) सार्वजनिक वर्ग सर्कल आकार (पब्लिक व्हॉइड ड्रॉ() ( System.out.println("Circle.draw()"); ) ) सार्वजनिक वर्ग त्रिकोण आकार लागू करतो ( सार्वजनिक शून्य ड्रॉ() ( System.out.println("Triangle.draw()"); ) ) सार्वजनिक वर्ग TestPol ( सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग आर्ग्स) ( आकार आकार 1 = नवीन मंडळ (); आकार आकार 2 = नवीन त्रिकोण ( testPoly(shape1)

सार्वजनिक इंटरफेस आकार (

शून्य ड्रॉ();

शून्य पुसून टाका();

सार्वजनिक शून्य ड्रॉ() (

प्रणाली. बाहेर println("Circle.draw()");

सार्वजनिक वर्ग त्रिकोण आकार लागू करतो (

सार्वजनिक शून्य ड्रॉ() (

प्रणाली. बाहेर println("Triangle.draw()");

सार्वजनिक वर्ग TestPol(

आकार आकार 1 = नवीन मंडळ();

आकार आकार 2 = नवीन त्रिकोण();

testPoly(shape1);

testPoly(shape2);

सार्वजनिक स्थिर शून्य चाचणीपॉली(आकार आकार) (

आकार काढा();

// कन्सोलसाठी आउटपुट:

//Circle.draw()

//Triangle.draw()

एक सामान्य इंटरफेस आहे “आकार” आणि त्याची दोन अंमलबजावणी “त्रिकोण” आणि “वर्तुळ”. प्रत्येकाची ‘ड्रॉ’ पद्धत असते. पॉलीमॉर्फिझमबद्दल धन्यवाद, आम्हाला "ड्रॉ" पद्धत म्हणण्यासाठी अनेक आकारांपैकी प्रत्येकासाठी वेगळी पद्धत लिहिण्याची आवश्यकता नाही. पॉलीमॉर्फिक पद्धतीला कॉल केल्याने एका प्रकाराला त्याचा फरक दुसऱ्या, समान प्रकारातून व्यक्त करता येतो, जरी ते समान मूळ प्रकारातून आलेले असले तरीही. हा फरक बेस क्लास (किंवा इंटरफेस) द्वारे कॉल केलेल्या पद्धतींच्या विविध क्रियांद्वारे व्यक्त केला जातो.
येथे पॉलीमॉर्फिझमचे उदाहरण आहे (याला डायनॅमिक बाइंडिंग, किंवा लेट बाइंडिंग, किंवा रन-टाइम बाइंडिंग देखील म्हणतात), जे प्रोग्रॅमच्या अंमलबजावणीदरम्यान पास केलेल्या ऑब्जेक्टशी संबंधित पद्धत कशी कार्यान्वित केली जाईल हे दर्शवते.

जर पॉलिमॉर्फिझम आणि लेट बाइंडिंग नसेल तर समान प्रोग्राम असे काहीतरी दिसेल:

सार्वजनिक स्थिर शून्य testPolyCircle(वर्तुळ वर्तुळ) ( circle.draw(); ) सार्वजनिक स्थिर शून्य testPolyTriangle(त्रिकोण त्रिकोण) ( triangle.draw(); )

सार्वजनिक स्थिर शून्य चाचणी पॉली सर्कल(वर्तुळ मंडळ) (

वर्तुळ काढा();

सार्वजनिक स्थिर शून्य चाचणीपॉलीट्राँगल(त्रिकोण त्रिकोण) (

त्रिकोण काढा();

त्या. प्रत्येक वर्गासाठी (आकार) आपण स्वतंत्र पद्धत लिहू. त्यापैकी दोन आहेत, परंतु शेकडो आकडे (वर्ग) असतील तर?

2. "वर्ग" ची संकल्पना परिभाषित करा.

वर्ग हा वस्तूंच्या समूहाच्या सामान्य गुणधर्मांचे वर्णन करणारा आहे. हे गुणधर्म वस्तूंची वैशिष्ट्ये (आकार, वजन, रंग इ.) आणि वर्तन, भूमिका इ. दोन्ही असू शकतात.

3. वर्ग फील्ड/विशेषता म्हणजे काय?

क्लास फील्ड (विशेषता) हे ऑब्जेक्टचे वैशिष्ट्य आहे. उदाहरणार्थ, आकृतीसाठी हे नाव, क्षेत्र, परिमिती असू शकते.

सार्वजनिक वर्ग मंडळ आकार (खाजगी स्ट्रिंग नाव; खाजगी दुहेरी क्षेत्र; खाजगी स्ट्रिंग परिमिती;) लागू करते

सार्वजनिक वर्ग मंडळ आकार लागू करते (

खाजगी स्ट्रिंग नाव;

खाजगी दुहेरी क्षेत्र;

खाजगी स्ट्रिंग परिमिती;

4. वर्ग फील्डमध्ये प्रवेश कसा व्यवस्थित करावा?

प्रवेश सुधारक खाजगी आहे. get\set पद्धतींद्वारे प्रवेश.

5. "कन्स्ट्रक्टर" ची संकल्पना परिभाषित करा.

कन्स्ट्रक्टर ही एक विशेष पद्धत आहे ज्याला नवीन ऑब्जेक्ट तयार केल्यावर म्हणतात. कन्स्ट्रक्टर थेट निर्मितीच्या वेळी ऑब्जेक्टला आरंभ करतो. कन्स्ट्रक्टरचे नाव केससह वर्गाच्या नावासारखेच असते आणि कन्स्ट्रक्टरचे वाक्यरचना रिटर्न व्हॅल्यूशिवाय पद्धतीप्रमाणे असते.

सार्वजनिक वर्ग मंडळ आकार लागू करते ( सार्वजनिक मंडळ() ( ) )

सार्वजनिक वर्ग मंडळ आकार लागू करते (

सार्वजनिक मंडळ()(

6. डीफॉल्ट, कॉपी आणि पॅरामीटर कन्स्ट्रक्टरमध्ये काय फरक आहे?

डीफॉल्ट कन्स्ट्रक्टर कोणतेही पॅरामीटर्स स्वीकारत नाही. कॉपी कन्स्ट्रक्टर पॅरामीटर म्हणून क्लास ऑब्जेक्ट घेतो. पॅरामीटराइज्ड कन्स्ट्रक्टर इनपुट पॅरामीटर्स म्हणून घेतो (सामान्यत: वर्गाच्या फील्ड सुरू करण्यासाठी आवश्यक).

//डिफॉल्ट कन्स्ट्रक्टर पब्लिक सर्कल() () //कॉपी कन्स्ट्रक्टर पब्लिक सर्कल(सर्कल सर्कल) ( this(circle.getName(), circle.getArea(), circle.getPerimeter()); // पॅरामीटर्ससह कन्स्ट्रक्टरला कॉल केले जाईल खाली) // मापदंडांसह constructor सार्वजनिक मंडळ(स्ट्रिंग नाव, दुहेरी क्षेत्र, स्ट्रिंग परिमिती) ( this.name = name; this.area = क्षेत्र; this.perimeter = perimeter; )

//डिफॉल्ट कन्स्ट्रक्टर

सार्वजनिक मंडळ()(

//कॉपी कन्स्ट्रक्टर

सार्वजनिक मंडळ (वर्तुळ मंडळ) (

हे(मंडळ. getName(), वर्तुळ. getArea(), वर्तुळ. getPerimeter()); // खालील पॅरामीटर्ससह कन्स्ट्रक्टरला कॉल केले जाईल

पॅरामीटर्ससह // कन्स्ट्रक्टर

सार्वजनिक मंडळ (स्ट्रिंग नाव, दुहेरी क्षेत्र, स्ट्रिंग परिमिती) (

हे नाव = नाव;

हे क्षेत्र = क्षेत्र;

हे परिमिती = परिमिती;

कृपया लक्षात घ्या की कॉपी करण्याचा विषय (क्लोन()) खूप खोल आहे आणि अनेक लपलेल्या समस्या उद्भवण्याची शक्यता आहे. आपण http://habrahabr.ru/post/246993/ येथे थोडे वाचू शकता.

7. प्रवेश पातळीचे कोणते बदल तुम्हाला माहीत आहेत, त्या प्रत्येकाबद्दल आम्हाला सांगा.

  • खाजगी (बंद) - वर्ग सदस्याचा प्रवेश या वर्गाच्या पद्धती वगळता कोणालाही मंजूर नाही. त्याच पॅकेजमधील इतर वर्ग खाजगी सदस्यांना प्रवेश देऊ शकत नाहीत.
  • डीफॉल्ट, पॅकेज, फ्रेंडली, डीफॉल्ट ऍक्सेस जेव्हा कोणताही सुधारक उपस्थित नसतो - वर्ग सदस्याला त्याच्या स्वतःच्या पॅकेजमध्ये सार्वजनिक मानले जाते, परंतु या पॅकेजच्या बाहेर असलेल्या कोडमध्ये प्रवेश करण्यायोग्य नाही. जर package2.Class2 ने package1.MainClass चा विस्तार केला, तर Class2 पद्धतींमध्ये ओळखकर्त्याशिवायमेनक्लास मधून दृश्यमान आहेत ते करणार नाहीत.
  • संरक्षित (संरक्षित) - पॅकेज आणि त्याच्या वंशज वर्गांमध्ये प्रवेश. दुसऱ्या पॅकेजमधून वर्गात प्रवेश मुख्य वर्गाच्या सार्वजनिक आणि संरक्षित पद्धतींसाठी असेल. त्या. जर package2.Class2 ने package1.MainClass चा विस्तार केला, तर Package2.Class2 च्या आत MainClass मधील संरक्षित अभिज्ञापक असलेल्या पद्धती दिसतील.
  • सार्वजनिक (खुले) - इतर कोणत्याही प्रोजेक्ट कोडमधून प्रत्येकासाठी प्रवेश

प्रोग्राममध्ये दृश्यमानता वाढवण्याच्या क्रमाने सूचीमधील सुधारकांची व्यवस्था केली आहे.

8. एकल खाजगी कन्स्ट्रक्टर असलेल्या वर्गाच्या वैशिष्ट्यांबद्दल आम्हाला सांगा.

वर्गाच्या बाहेर एकच खाजगी कन्स्ट्रक्टर असलेल्या वर्गाची वस्तू तयार करणे अशक्य आहे. म्हणून, आपण अशा वर्गाकडून वारसा घेऊ शकत नाही. वारसा मिळवण्याचा प्रयत्न करताना, एक त्रुटी टाकली जाईल: ClassName मध्ये कोणताही डिफॉल्ट कन्स्ट्रक्टर उपलब्ध नाही. आणि या वर्गाचा ऑब्जेक्ट तयार करण्याचा प्रयत्न करताना: ClassName() ला ClassName मध्ये खाजगी प्रवेश आहे

9. “हा”, “सुपर” या कीवर्डचा अर्थ काय आहे, ते कुठे आणि कसे वापरले जाऊ शकतात?

super चा वापर बेस क्लासचा संदर्भ देण्यासाठी केला जातो आणि सध्याचा संदर्भ देण्यासाठी वापरला जातो. उदाहरण:

सार्वजनिक वर्ग प्राणी ( सार्वजनिक शून्य खाणे() ( System.out.println("प्राणी खाणे"); ) ) सार्वजनिक वर्ग कुत्रा प्राणी विस्तारित करतो ( सार्वजनिक शून्य खाणे() ( System.out.println("कुत्रा खाणे"); ) सार्वजनिक void thisEat() ( System.out.println("Call Dog.eat()"); this.eat(); ) सार्वजनिक शून्य superEat() ( System.out.println("Call Animal.eat()"); सुपर.ईट(); eat Call Dog.eat() Dog eat Call Animal.eat() प्राणी खा

सार्वजनिक वर्ग प्राणी (

सार्वजनिक शून्य खाणे() (

प्रणाली. बाहेर println("प्राणी खातात");

सार्वजनिक वर्ग कुत्रा प्राणी वाढवतो (

सार्वजनिक शून्य खाणे() (

प्रणाली. बाहेर println("कुत्रा खातो");

सार्वजनिक रिकामा thisEat() (

प्रणाली. बाहेर println ("Call Dog.eat()" );

हे खा ();

सार्वजनिक शून्य सुपरईट() (

प्रणाली. बाहेर println ("Animal.eat()" वर कॉल करा );

सुपर खा ();

सार्वजनिक वर्ग चाचणी (

सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग आर्ग्स) (

कुत्रा कुत्रा = नवीन कुत्रा();

कुत्रा खा ();

कुत्रा thisEat();

कुत्रा superEat();

कुत्रा खातात

कुत्र्याला कॉल करा. खा ()

कुत्रा खातात

प्राण्याला कॉल करा. खा ()

प्राणी खातात

जर तुम्ही super() लिहिला तर बेस क्लासचा कन्स्ट्रक्टर कॉल केला जाईल आणि जर this(), तर सध्याच्या क्लासचा कन्स्ट्रक्टर. हे वापरले जाऊ शकते, उदाहरणार्थ, पॅरामीटर्ससह कन्स्ट्रक्टरला कॉल करताना:

सार्वजनिक कुत्रा() ( System.out.println("रिक्त कन्स्ट्रक्टरला कॉल करा"); ) सार्वजनिक कुत्रा(स्ट्रिंग नाव) ( System.out.println("नावासह कन्स्ट्रक्टरला कॉल करा"); this.name = name; ) सार्वजनिक कुत्रा( स्ट्रिंगचे नाव, दुप्पट वजन) ( हे(नाव); this.weight = वजन; System.out.println("नाव आणि वजनासह कन्स्ट्रक्टरला कॉल करा"); ) ) .. सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग आर्ग्स) ( डॉग डॉग1 = नवीन डॉग ("नाव", 25.0 ) // नाव आणि वजनासह आउटपुट कॉल कन्स्ट्रक्टर

सार्वजनिक कुत्रा() (

प्रणाली. बाहेर println("रिक्त कन्स्ट्रक्टरला कॉल करा");

सार्वजनिक कुत्रा (स्ट्रिंग नाव) (

प्रणाली. बाहेर println ("नावासह कन्स्ट्रक्टरला कॉल करा" );

हे नाव = नाव;

सार्वजनिक कुत्रा (स्ट्रिंग नाव, दुप्पट वजन) (

हे (नाव);

हे वजन = वजन;

प्रणाली. बाहेर println( "नाव आणि वजनासह कन्स्ट्रक्टरला कॉल करा") ;

सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग आर्ग्स) (

कुत्रा कुत्रा 1 = नवीन कुत्रा ("नाव", 25.0);

// निष्कर्ष

नावासह कन्स्ट्रक्टरला कॉल करा

नाव आणि वजनासह कन्स्ट्रक्टरला कॉल करा

10. "पद्धती" ची संकल्पना परिभाषित करा.

पद्धत म्हणजे विशिष्ट नावाने संबोधल्या जाणाऱ्या आदेशांचा क्रम. आम्ही असे म्हणू शकतो की हे एक कार्य आणि एक प्रक्रिया आहे (रिकामा पद्धतीच्या बाबतीत).

11. पद्धत स्वाक्षरी म्हणजे काय?

Java मधील पद्धतीची स्वाक्षरी म्हणजे पद्धतीचे नाव आणि पॅरामीटर्स (आणि पॅरामीटर्सचा क्रम महत्त्वाचा असतो).
पद्धतीच्या स्वाक्षरीमध्ये रिटर्न व्हॅल्यू, ते फेकलेले अपवाद किंवा मॉडिफायर्स समाविष्ट नाहीत.

कीवर्ड सार्वजनिक, संरक्षित, खाजगी, अमूर्त, स्थिर, अंतिम, समक्रमित, मूळ, कठोर एफपी, समावेश. पद्धतीसाठी भाष्ये सुधारक असतात आणि स्वाक्षरीचा भाग नसतात.

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2

12. कोणत्या पद्धतींना ओव्हरलोड म्हणतात?

Java तुम्हाला एकाच नावाने परंतु भिन्न स्वाक्षरी असलेल्या अनेक पद्धती तयार करण्यास अनुमती देते. समान नावाची परंतु भिन्न पॅरामीटर्ससह पद्धत तयार करणे याला ओव्हरलोडिंग म्हणतात. वास्तविक पॅरामीटर्सवर आधारित कॉल केल्यावर कोणती ओव्हरलोड केलेली पद्धत कार्यान्वित करावी हे Java निर्धारित करते.

सार्वजनिक शून्य पद्धत() () सार्वजनिक शून्य पद्धत(इंट ए) () सार्वजनिक शून्य पद्धत(स्ट्रिंग स्ट्रिंग) ( )

सार्वजनिक शून्य पद्धत () ()

सार्वजनिक शून्य पद्धत (int a) ( )

मूलत: प्रिस्क्रिप्टिव्ह प्रोग्रामिंग पॅराडाइम वापरले - डेटावर योग्यरित्या कार्य करणारा कोड तयार करणे हे लक्ष्य होते. हा दृष्टीकोन लहान समस्या सोडवण्यासाठी चांगला आहे, परंतु ते निर्माण करण्याचा प्रयत्न करताना अनेक गुंतागुंतीच्या समस्या निर्माण करतात मोठ्या सॉफ्टवेअर प्रणाली.

पर्यायांपैकी एक निर्देशात्मक प्रोग्रामिंगआहे ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, जे खरोखरप्रोग्रॅम्सचे व्हॉल्यूम वाढत असताना त्यांच्या अरेखीय वाढत्या जटिलतेचा सामना करण्यास मदत करते. तथापि, एखाद्याने असा निष्कर्ष काढू नये की ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पॅराडाइम वापरणे सर्व समस्यांचे यशस्वी निराकरण करण्याची हमी देते.

प्रोग्रॅमिंगमध्ये व्यावसायिक बनण्यासाठी तुम्हाला प्रतिभा, सर्जनशीलता, बुद्धिमत्ता, ज्ञान, तर्कशास्त्र, अमूर्तता तयार करण्याची आणि वापरण्याची क्षमता आणि सर्वात महत्त्वाचे म्हणजे अनुभव आवश्यक आहे.

या विभागात, आम्ही ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगच्या मूलभूत संकल्पनांचा परिचय सुरू ठेवू, ज्याची सुरुवात आम्ही पुस्तकाच्या पहिल्या प्रकरणात केली होती. प्रथम, विविध प्रोग्रामिंग भाषांमध्ये सामान्य असलेल्या OOP संकल्पनांवर चर्चा केली जाईल आणि नंतर जावा भाषेत त्यांची अंमलबजावणी.

तुम्हाला हे माहित असले पाहिजे की ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगचा कोर्स अंडरग्रेजुएट विद्यार्थ्यांना संपूर्ण सेमिस्टरमध्ये शिकवला जातो आणि म्हणून खाली सादर केलेली सामग्री OOP च्या जगाची केवळ एक अतिशय मूलभूत ओळख दर्शवते. ऑब्जेक्ट-ओरिएंटेड डिझाइन, अभियांत्रिकी आणि प्रोग्रामिंगशी संबंधित बऱ्याच समस्यांचे अधिक व्यापक कव्हरेज पुस्तकात समाविष्ट आहे आणि पुस्तकाच्या तिसऱ्या प्रकरणात आपल्याला Java च्या सर्व ऑब्जेक्ट-देणारं पैलूंचे अगदी स्पष्ट वर्णन सापडेल. भाषा

मूलभूत OOP संकल्पना

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग किंवा ओओपी (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) - प्रोग्रामिंग पद्धतऑब्जेक्ट्सचा संग्रह म्हणून प्रोग्रामच्या प्रतिनिधित्वावर आधारित, ज्यापैकी प्रत्येक एक विशिष्ट प्रकारची अंमलबजावणी आहे, एक यंत्रणा वापरून संदेश अग्रेषित करणेआणि वर्ग आयोजित वारसा श्रेणीक्रम.

OOP चे मध्यवर्ती घटक ॲब्स्ट्रॅक्शन आहे. डेटा ॲब्स्ट्रॅक्शन वापरून ऑब्जेक्ट्समध्ये रूपांतरित केला जातो आणि या डेटावर प्रक्रिया करण्याचा क्रम या ऑब्जेक्ट्स दरम्यान पास केलेल्या संदेशांच्या संचामध्ये बदलतो. प्रत्येक वस्तूचे स्वतःचे वेगळे वर्तन असते. वस्तूंना ठोस घटक मानले जाऊ शकते जे संदेशांना प्रतिसाद देतात जे त्यांना काही कृती करण्यासाठी आज्ञा देतात.

ओओपी खालील तत्त्वांद्वारे वैशिष्ट्यीकृत आहे (ॲलन केनुसार):

  • सर्व काही एक वस्तू आहे;
  • ऑब्जेक्ट्समधील परस्परसंवादाद्वारे (डेटा एक्सचेंज) गणना केली जाते, ज्यामध्ये काही क्रिया करण्यासाठी एका ऑब्जेक्टला दुसर्या ऑब्जेक्टची आवश्यकता असते; वस्तू संदेश पाठवून आणि प्राप्त करून संवाद साधतात; संदेश म्हणजे कृती करण्याची विनंती, कृती करताना आवश्यक असलेल्या युक्तिवादांच्या संचाने पूरक;
  • प्रत्येक ऑब्जेक्ट एक स्वतंत्र आहे स्मृती, ज्यामध्ये इतर वस्तू असतात;
  • प्रत्येक ऑब्जेक्ट एका वर्गाचा प्रतिनिधी आहे जो दिलेल्या प्रकारच्या वस्तूंचे सामान्य गुणधर्म व्यक्त करतो;
  • वर्गात सेट करा कार्यक्षमता(वस्तूचे वर्तन); अशा प्रकारे, सर्व ऑब्जेक्ट्स जे समान वर्गाचे उदाहरण आहेत समान क्रिया करू शकतात;
  • वर्ग एकाच झाडाच्या संरचनेत एका सामान्य मुळासह आयोजित केले जातात, ज्याला म्हणतात वारसा श्रेणीक्रम; विशिष्ट वर्गाच्या उदाहरणांशी संबंधित स्मृती आणि वर्तन श्रेणीबद्ध वृक्षातील खालच्या कोणत्याही वर्गासाठी आपोआप उपलब्ध असते.

व्याख्या 10.1. अमूर्त- समस्या सोडवण्याची एक पद्धत ज्यामध्ये विविध प्रकारच्या वस्तू एका सामान्य संकल्पनेने (संकल्पना) एकत्र केल्या जातात आणि नंतर गटबद्ध घटकांना एकाच श्रेणीचे घटक मानले जाते.

अमूर्ततुम्हाला प्रोग्रामच्या तुकड्याचा तार्किक अर्थ त्याच्या अंमलबजावणीच्या समस्येपासून वेगळे करण्याची परवानगी देते, विभाजित करते बाह्य वर्णनऑब्जेक्टचा (इंटरफेस) आणि त्याचा अंतर्गत संस्था(अंमलबजावणी).

व्याख्या 10.2. एन्कॅप्सुलेशन- एक तंत्र ज्यामध्ये ऑब्जेक्टच्या इंटरफेसच्या दृष्टिकोनातून नगण्य असलेली माहिती त्याच्या आत लपलेली असते.

व्याख्या 10.3. वारसा- ऑब्जेक्ट्सचा गुणधर्म ज्याद्वारे वर्गाची उदाहरणे त्यांना पुन्हा परिभाषित न करता पूर्वज वर्गांच्या डेटा आणि पद्धतींमध्ये प्रवेश मिळवतात.

वारसा विविध डेटा प्रकारांना समान कोड सामायिक करण्यास अनुमती देतो, परिणामी लहान कोड आणि अधिक कार्यक्षमता.

व्याख्या 10.4.



आम्ही वाचण्याची शिफारस करतो

वर