1. परिचय
जावा एक प्रोग्रामिंग भाषा है जो विभिन्न क्षेत्रों में व्यापक रूप से उपयोग की जाती है, एंटरप्राइज सिस्टम से लेकर वेब एप्लिकेशन्स और एंड्रॉइड डेवलपमेंट तक। इसके कई फीचर्स में से, “इनहेरिटेंस” ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सीखते समय सबसे आवश्यक अवधारणाओं में से एक है।
इनहेरिटेंस का उपयोग करके, एक नई क्लास (सबक्लास/चाइल्ड क्लास) एक मौजूदा क्लास (सुपरक्लास/पैरेंट क्लास) की कार्यक्षमता को ले सकती है। यह कोड डुप्लिकेशन को कम करने में मदद करता है और प्रोग्राम्स को विस्तारित और मेंटेन करने में आसान बनाता है। जावा में, इनहेरिटेंस extends कीवर्ड का उपयोग करके लागू की जाती है।
इस लेख में, हम जावा में extends कीवर्ड की भूमिका, इसके बेसिक उपयोग, प्रैक्टिकल एप्लिकेशन्स, और सामान्य प्रश्नों को स्पष्ट रूप से समझाते हैं। यह गाइड न केवल जावा के शुरुआती लोगों के लिए उपयोगी है बल्कि उन लोगों के लिए भी जो इनहेरिटेंस को रिव्यू करना चाहते हैं। अंत तक, आप इनहेरिटेंस के फायदे और नुकसान को पूरी तरह समझ जाएंगे साथ ही महत्वपूर्ण डिजाइन विचारों को।
चलो “जावा में इनहेरिटेंस क्या है?” को करीब से देखना शुरू करते हैं।
2. जावा इनहेरिटेंस क्या है?
जावा इनहेरिटेंस एक तंत्र है जिसमें एक क्लास (सुपरक्लास/पैरेंट क्लास) अपनी विशेषताओं और कार्यक्षमता को दूसरी क्लास (सबक्लास/चाइल्ड क्लास) को पास करती है। इनहेरिटेंस के साथ, पैरेंट क्लास में परिभाषित फील्ड्स (वेरिएबल्स) और मेथड्स (फंक्शन्स) को चाइल्ड क्लास में पुन: उपयोग किया जा सकता है। यह तंत्र कोड को व्यवस्थित और प्रबंधित करने में आसान बनाता है, साझा प्रक्रियाओं को केंद्रीकृत करता है, और कार्यक्षमता को लचीले ढंग से विस्तारित या संशोधित करने की अनुमति देता है। इनहेरिटेंस ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) के तीन मुख्य स्तंभों में से एक है, एन्कैप्सुलेशन और पॉलीमॉर्फिज्म के साथ।
“is-a” संबंध के बारे में
इनहेरिटेंस का एक सामान्य उदाहरण “is-a संबंध” है। उदाहरण के लिए, “एक कुत्ता एक जानवर है।” इसका मतलब है कि Dog क्लास Animal क्लास से इनहेरिट करती है। एक कुत्ता जानवर की विशेषताओं और व्यवहारों को ले सकता है जबकि अपनी अनोखी फीचर्स जोड़ सकता है।
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
इस उदाहरण में, Dog क्लास Animal क्लास से इनहेरिट करती है। Dog का एक इंस्टेंस bark मेथड और इनहेरिटेड eat मेथड दोनों का उपयोग कर सकता है।
इनहेरिटेंस का उपयोग करने पर क्या होता है?
- आप साझा लॉजिक और डेटा को पैरेंट क्लास में केंद्रीकृत कर सकते हैं, जिससे प्रत्येक सबक्लास में बार-बार एक ही कोड लिखने की आवश्यकता कम हो जाती है।
- प्रत्येक सबक्लास अपनी अनोखी व्यवहार जोड़ सकती है या पैरेंट क्लास के मेथड्स को ओवरराइड कर सकती है।
इनहेरिटेंस का उपयोग प्रोग्राम संरचना को व्यवस्थित करने में मदद करता है और फीचर्स जोड़ने तथा मेंटेनेंस को आसान बनाता है। हालांकि, इनहेरिटेंस हमेशा सबसे अच्छा विकल्प नहीं होता, और डिजाइन के दौरान यह महत्वपूर्ण है कि एक वास्तविक “is-a संबंध” मौजूद है या नहीं, इसका सावधानीपूर्वक मूल्यांकन करें।
3. extends कीवर्ड कैसे काम करता है
जावा में extends कीवर्ड क्लास इनहेरिटेंस को स्पष्ट रूप से घोषित करता है। जब एक चाइल्ड क्लास पैरेंट क्लास की कार्यक्षमता को इनहेरिट करती है, तो क्लास घोषणा में extends ParentClassName सिंटैक्स का उपयोग किया जाता है। इससे चाइल्ड क्लास पैरेंट क्लास के सभी पब्लिक मेंबर्स (फील्ड्स और मेथड्स) को सीधे उपयोग कर सकती है।
बेसिक सिंटैक्स
class ParentClass {
// Fields and methods of the parent class
}
class ChildClass extends ParentClass {
// Fields and methods unique to the child class
}
उदाहरण के लिए, पहले के Animal और Dog क्लासेस का उपयोग करके, हम प्राप्त करते हैं:
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
Dog extends Animal लिखकर, Dog क्लास Animal क्लास से इनहेरिट करती है और eat मेथड का उपयोग कर सकती है।
पैरेंट क्लास मेंबर्स का उपयोग
इनहेरिटेंस के साथ, चाइल्ड क्लास का एक इंस्टेंस पैरेंट क्लास के मेथड्स और फील्ड्स को एक्सेस कर सकता है (जब तक एक्सेस मॉडिफायर्स अनुमति दें):
Dog dog = new Dog();
dog.eat(); // Calls the parent class method
dog.bark(); // Calls the child class method
महत्वपूर्ण नोट्स
- जावा केवल एक क्लास (सिंगल इनहेरिटेंस) से इनहेरिटेंस की अनुमति देता है। आप
extendsके बाद कई क्लास नहीं निर्दिष्ट कर सकते। - यदि आप इनहेरिटेंस को रोकना चाहते हैं, तो क्लास पर
finalमॉडिफायर का उपयोग कर सकते हैं।
व्यावहारिक विकास टिप्स
extends का सही उपयोग करने से आप सामान्य कार्यक्षमता को पैरेंट क्लास में केंद्रीकृत कर सकते हैं और सबक्लास में व्यवहार को विस्तारित या कस्टमाइज़ कर सकते हैं। यह तब भी उपयोगी होता है जब आप मौजूदा कोड को बदले बिना नई सुविधाएँ जोड़ना चाहते हैं।
4. मेथड ओवरराइडिंग और super कीवर्ड
इनहेरिटेंस का उपयोग करते समय ऐसे मामले होते हैं जहाँ आप पैरेंट क्लास में परिभाषित मेथड के व्यवहार को बदलना चाहते हैं। इसे “मेथड ओवरराइडिंग” कहा जाता है। जावा में, ओवरराइडिंग तब होती है जब आप चाइल्ड क्लास में वही नाम और वही पैरामीटर सूची वाला मेथड परिभाषित करते हैं जो पैरेंट क्लास में है।
मेथड ओवरराइडिंग
मेथड को ओवरराइड करते समय आमतौर पर @Override एनोटेशन जोड़ते हैं। यह कंपाइलर को अनजाने में हुई गलतियों जैसे कि गलत मेथड नाम या सिग्नेचर को पहचानने में मदद करता है।
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("ドッグフードを食べる");
}
}
इस उदाहरण में, Dog क्लास eat मेथड को ओवरराइड करती है। जब आप Dog इंस्टेंस पर eat को कॉल करते हैं, तो आउटपुट होगा “ドッグフードを食べる”.
Dog dog = new Dog();
dog.eat(); // Displays: ドッグフードを食べる
super कीवर्ड का उपयोग
यदि आप ओवरराइडेड मेथड के भीतर पैरेंट क्लास की मूल मेथड को कॉल करना चाहते हैं, तो super कीवर्ड का उपयोग करें।
class Dog extends Animal {
@Override
void eat() {
super.eat(); // Calls the parent class’s eat()
System.out.println("ドッグフードも食べる");
}
}
यह पहले पैरेंट क्लास की eat मेथड को निष्पादित करता है और फिर सबक्लास के व्यवहार को जोड़ता है।
कंस्ट्रक्टर्स और super
यदि पैरेंट क्लास के पास पैरामीटर वाला कंस्ट्रक्टर है, तो चाइल्ड क्लास को इसे स्पष्ट रूप से super(arguments) के रूप में अपने कंस्ट्रक्टर की पहली पंक्ति में कॉल करना होगा।
class Animal {
Animal(String name) {
System.out.println("Animal: " + name);
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
System.out.println("Dog: " + name);
}
}
सारांश
- ओवरराइडिंग का अर्थ है पैरेंट क्लास के मेथड को चाइल्ड क्लास में पुनः परिभाषित करना।
@Overrideएनोटेशन का उपयोग करने की सलाह दी जाती है।- जब आप पैरेंट क्लास की मेथड इम्प्लीमेंटेशन को पुन: उपयोग करना चाहते हैं, तो
superका उपयोग करें। - पैरेंट कंस्ट्रक्टर्स को कॉल करने के लिए भी
superका उपयोग किया जाता है।
5. इनहेरिटेंस के फायदे और नुकसान
जावा में इनहेरिटेंस का उपयोग करने से प्रोग्राम डिज़ाइन और विकास में कई लाभ मिलते हैं। हालांकि, गलत उपयोग से गंभीर समस्याएँ उत्पन्न हो सकती हैं। नीचे हम इनहेरिटेंस के फायदों और नुकसानों को विस्तार से समझाते हैं।
इनहेरिटेंस के फायदे
- कोड पुन: उपयोग में सुधार
पैरेंट क्लास में साझा लॉजिक और डेटा को परिभाषित करने से प्रत्येक सबक्लास में वही कोड दोहराने की आवश्यकता नहीं रहती। इससे डुप्लिकेशन कम होता है और मेंटेनबिलिटी व रीडेबिलिटी बढ़ती है। - आसान विस्तार
जब नई कार्यक्षमता की आवश्यकता होती है, तो आप मौजूदा कोड को बदले बिना पैरेंट क्लास के आधार पर नया सबक्लास बना सकते हैं। इससे परिवर्तन का प्रभाव कम होता है और बग्स की संभावना घटती है। - पॉलीमॉर्फ़िज़्म को सक्षम करता है
इनहेरिटेंस “पैरेंट क्लास का एक वेरिएबल चाइल्ड क्लास की इंस्टेंस को रेफ़र कर सकता है” को संभव बनाता है। यह सामान्य इंटरफ़ेस और पॉलीमॉर्फ़िक व्यवहार का उपयोग करके लचीला डिज़ाइन प्रदान करता है।
इनहेरिटेंस के नुकसान
- गहन पदानुक्रम डिज़ाइन को जटिल बनाते हैं यदि उत्तराधिकार श्रृंखलाएँ बहुत गहरी हो जाती हैं, तो यह समझना कठिन हो जाता है कि व्यवहार कहाँ परिभाषित है, जिससे रखरखाव कठिन हो जाता है।
- मूल वर्ग में परिवर्तन सभी उपवर्गों को प्रभावित करते हैं मूल वर्ग के व्यवहार को संशोधित करने से सभी उपवर्गों में अनजाने में समस्याएँ हो सकती हैं। मूल वर्गों को सावधानीपूर्वक डिज़ाइन और अपडेट की आवश्यकता होती है।
- डिज़ाइन लचीलापन कम कर सकता है उत्तराधिकार का अत्यधिक उपयोग कक्षाओं को कसकर जोड़ देता है, जिससे भविष्य के परिवर्तन कठिन हो जाते हैं। कुछ मामलों में, संरचना का उपयोग करके “has-a” संबंध “is-a” उत्तराधिकार से अधिक लचीले होते हैं।
सारांश
उत्तराधिकार शक्तिशाली है, लेकिन इसके लिए सब कुछ पर निर्भर रहना दीर्घकालिक समस्याएँ पैदा कर सकता है। हमेशा सत्यापित करें कि क्या एक सच्चा “is-a संबंध” मौजूद है और उत्तराधिकार को केवल तभी लागू करें जब उपयुक्त हो।
6. उत्तराधिकार और इंटरफेस के बीच अंतर
जावा कार्यक्षमता को विस्तारित करने और संगठित करने के लिए दो महत्वपूर्ण तंत्र प्रदान करता है: वर्ग उत्तराधिकार (extends) और इंटरफेस (implements)। दोनों कोड पुन: उपयोग और लचीले डिज़ाइन का समर्थन करते हैं, लेकिन उनकी संरचना और इच्छित उपयोग में महत्वपूर्ण अंतर है। नीचे, हम अंतरों की व्याख्या करते हैं और उनके बीच चयन कैसे करें।
extends और implements के बीच अंतर
- extends (उत्तराधिकार)
- आप केवल एक वर्ग से उत्तराधिकार प्राप्त कर सकते हैं (एकल उत्तराधिकार)।
- मूल वर्ग से फ़ील्ड और पूर्ण रूप से लागू की गई विधियाँ को उपवर्ग में सीधे उपयोग किया जा सकता है।
- “is-a संबंध” का प्रतिनिधित्व करता है (उदाहरण के लिए, एक कुत्ता एक जानवर है)।
- implements (इंटरफेस कार्यान्वयन)
- एक साथ कई इंटरफेस लागू किए जा सकते हैं।
- इंटरफेस केवल विधि घोषणाएँ शामिल करते हैं (हालांकि Java 8 से डिफ़ॉल्ट विधियाँ मौजूद हैं)।
- “can-do संबंध” का प्रतिनिधित्व करता है (उदाहरण के लिए, एक कुत्ता भौंक सकता है, एक कुत्ता चल सकता है)।
इंटरफेस का उपयोग करने का उदाहरण
interface Walkable {
void walk();
}
interface Barkable {
void bark();
}
class Dog implements Walkable, Barkable {
public void walk() {
System.out.println("歩く");
}
public void bark() {
System.out.println("ワンワン");
}
}
इस उदाहरण में, Dog वर्ग दो इंटरफेस, Walkable और Barkable को लागू करता है, जो बहु-उत्तराधिकार के समान व्यवहार प्रदान करता है। 
इंटरफेस क्यों आवश्यक हैं
जावा वर्गों के बहु-उत्तराधिकार को प्रतिबंधित करता है क्योंकि जब मूल वर्ग समान विधियों या फ़ील्ड को परिभाषित करते हैं तो यह संघर्ष पैदा कर सकता है। इंटरफेस इस समस्या को हल करते हैं एक वर्ग को कई “प्रकारों” को अपनाने की अनुमति देकर बिना संघर्षपूर्ण कार्यान्वयनों को उत्तराधिकार प्राप्त किए।
उन्हें ठीक से कैसे उपयोग करें
- जब वर्गों के बीच स्पष्ट “is-a संबंध” मौजूद हो तो
extendsका उपयोग करें। - जब आप कई वर्गों में सामान्य व्यवहार अनुबंध प्रदान करना चाहते हैं तो
implementsका उपयोग करें।
उदाहरण:
- “एक कुत्ता एक जानवर है” →
Dog extends Animal - “एक कुत्ता चल सकता है और भौंक सकता है” →
Dog implements Walkable, Barkable
सारांश
- एक वर्ग केवल एक मूल वर्ग से उत्तराधिकार प्राप्त कर सकता है, लेकिन यह कई इंटरफेस लागू कर सकता है।
- डिज़ाइन इरादे के आधार पर उत्तराधिकार और इंटरफेस के बीच चयन साफ, लचीला और रखरखाव योग्य कोड की ओर ले जाता है।
7. उत्तराधिकार का उपयोग करने के लिए सर्वोत्तम प्रथाएँ
जावा में उत्तराधिकार शक्तिशाली है, लेकिन अनुचित उपयोग कार्यक्रम को कठोर और रखरखाव कठिन बना सकता है। नीचे उत्तराधिकार को सुरक्षित और प्रभावी ढंग से उपयोग करने के लिए सर्वोत्तम प्रथाएँ और दिशानिर्देश दिए गए हैं।
उत्तराधिकार का उपयोग कब करें — और कब बचें
- उत्तराधिकार का उपयोग करें जब:
- स्पष्ट “is-a संबंध” मौजूद हो (उदाहरण के लिए, एक कुत्ता एक जानवर है)।
- आप मूल वर्ग की कार्यक्षमता को पुन: उपयोग करना और इसे विस्तारित करना चाहते हैं।
- आप अतिरिक्त कोड को समाप्त करना और सामान्य तर्क को केंद्रीकृत करना चाहते हैं।
- उत्तराधिकार से बचें जब:
- आप इसे केवल कोड पुन: उपयोग के लिए उपयोग कर रहे हैं (यह अक्सर अस्वाभाविक वर्ग डिज़ाइन की ओर ले जाता है)।
- “has-a संबंध” अधिक उपयुक्त हो — ऐसे मामलों में, संरचना पर विचार करें।
उत्तराधिकार और संरचना के बीच चयन
- विरासत (
extends): is-a संबंध - उदाहरण:
Dog extends Animal - उपयोगी जब उपवर्ग वास्तव में सुपरक्लास का प्रकार दर्शाता है।
- संरचना (has-a संबंध)
- उदाहरण: एक कार में एक इंजन होता है
- आंतरिक रूप से किसी अन्य क्लास की एक इंस्टेंस का उपयोग करके कार्यक्षमता जोड़ता है।
- अधिक लचीला और भविष्य के बदलावों के अनुकूल बनाना आसान।
विरासत के दुरुपयोग को रोकने के लिए डिज़ाइन दिशानिर्देश
- विरासत पदानुक्रम को बहुत गहरा न बनाएं (3 स्तर या कम रखें)।
- यदि कई उपवर्ग एक ही पैरेंट से विरासत लेते हैं, तो पैरेंट की जिम्मेदारियों की उपयुक्तता का पुनर्मूल्यांकन करें।
- हमेशा इस जोखिम को ध्यान में रखें कि पैरेंट क्लास में बदलाव सभी उपवर्गों को प्रभावित कर सकते हैं।
- विरासत लागू करने से पहले, इंटरफ़ेस और संरचना जैसे विकल्पों पर विचार करें।
final मॉडिफ़ायर के साथ विरासत को सीमित करना
- किसी क्लास में
finalजोड़ने से वह विरासत में नहीं ली जा सकती। - किसी मेथड में
finalजोड़ने से वह उपवर्गों द्वारा ओवरराइड नहीं किया जा सकता।final class Utility { // This class cannot be inherited } class Base { final void show() { System.out.println("オーバーライド禁止"); } }
दस्तावेज़ीकरण और टिप्पणियों को बेहतर बनाना
- Javadoc या टिप्पणियों में विरासत संबंधों और क्लास डिज़ाइन इरादों को दस्तावेज़ित करने से भविष्य में रखरखाव बहुत आसान हो जाता है।
सारांश
विरासत सुविधाजनक है, लेकिन इसे इरादे से उपयोग करना चाहिए। हमेशा पूछें, “क्या यह क्लास वास्तव में अपने पैरेंट क्लास की एक प्रकार है?” यदि अनिश्चित हैं, तो विकल्प के रूप में संरचना या इंटरफ़ेस पर विचार करें।
8. सारांश
अब तक हमने जावा विरासत और extends कीवर्ड को विस्तार से समझाया है—बुनियादी से लेकर व्यावहारिक उपयोग तक। नीचे इस लेख में कवर किए गए मुख्य बिंदुओं का सारांश दिया गया है।
- जावा विरासत एक उपवर्ग को सुपरक्लास के डेटा और कार्यक्षमता को अपनाने की अनुमति देती है, जिससे कुशल और पुन: उपयोग योग्य प्रोग्राम डिज़ाइन संभव होता है।
extendsकीवर्ड पैरेंट और चाइल्ड क्लास के बीच संबंध (“is-a संबंध”) को स्पष्ट करता है।- मेथड ओवरराइडिंग और
superकीवर्ड विरासत में मिली व्यवहार को विस्तारित या अनुकूलित करने में सक्षम बनाते हैं। - विरासत कई लाभ प्रदान करती है, जैसे कोड पुन: उपयोग, विस्तारशीलता, और पॉलीमॉर्फ़िज़्म का समर्थन, लेकिन इसके नुकसान भी हैं जैसे गहरी या जटिल पदानुक्रम और व्यापक प्रभाव वाले बदलाव।
- विरासत, इंटरफ़ेस, और संरचना के बीच अंतर को समझना सही डिज़ाइन दृष्टिकोण चुनने के लिए महत्वपूर्ण है।
- विरासत का अधिक उपयोग करने से बचें; हमेशा डिज़ाइन इरादा और तर्क को स्पष्ट रखें।
विरासत जावा में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के मुख्य अवधारणाओं में से एक है। नियमों और सर्वोत्तम प्रथाओं को समझकर, आप इसे वास्तविक विकास में प्रभावी रूप से लागू कर सकते हैं।
9. अक्सर पूछे जाने वाले प्रश्न (FAQ)
Q1: जावा में जब एक क्लास को विरासत में लिया जाता है, तो मूल वर्ग के कंस्ट्रक्टर के साथ क्या होता है?
A1: यदि मूल वर्ग में कोई तर्कहीन (डिफ़ॉल्ट) कंस्ट्रक्टर है, तो इसे संतान वर्ग के कंस्ट्रक्टर से स्वचालित रूप से कॉल किया जाता है। यदि मूल वर्ग में केवल पैरामीटर वाले कंस्ट्रक्टर हैं, तो संतान वर्ग को अपने कंस्ट्रक्टर की शुरुआत में super(arguments) का उपयोग करके इसे स्पष्ट रूप से कॉल करना चाहिए।
Q2: क्या जावा क्लासों की बहु-विरासत का समर्थन करता है?
A2: नहीं। जावा क्लासों की बहु-विरासत का समर्थन नहीं करता। एक क्लास extends का उपयोग करके केवल एक मूल वर्ग को ही विस्तारित कर सकता है। हालांकि, एक क्लास implements का उपयोग करके कई इंटरफेस को लागू कर सकता है।
Q3: विरासत और संयोजन के बीच क्या अंतर है?
A3: विरासत एक “है-एक संबंध” का प्रतिनिधित्व करती है, जहां संतान वर्ग मूल वर्ग की कार्यक्षमता और डेटा का पुन: उपयोग करता है। संयोजन एक “रखता-है संबंध” का प्रतिनिधित्व करता है, जिसमें एक क्लास में दूसरे क्लास का एक उदाहरण होता है। संयोजन अक्सर अधिक लचीलापन प्रदान करता है और ढीले संयोजन या भविष्य की विस्तारिता की आवश्यकता वाले कई मामलों में वरीयता दी जाती है।
Q4: क्या final मॉडिफायर विरासत और ओवरराइडिंग को प्रतिबंधित करता है?
A4: हाँ। यदि एक क्लास को final के रूप में चिह्नित किया गया है, तो इसे विरासत में नहीं लिया जा सकता। यदि एक विधि को final के रूप में चिह्नित किया गया है, तो इसे उपवर्ग में ओवरराइड नहीं किया जा सकता। यह सुसंगत व्यवहार सुनिश्चित करने या सुरक्षा उद्देश्यों के लिए उपयोगी है।
Q5: यदि मूल और संतान वर्ग में समान नाम वाले फील्ड या विधियाँ परिभाषित की जाती हैं, तो क्या होता है?
A5: यदि दोनों वर्गों में समान नाम वाला फील्ड परिभाषित है, तो संतान वर्ग में फील्ड मूल वर्ग वाले को छिपा देता है (शैडोइंग)। विधियाँ अलग व्यवहार करती हैं: यदि हस्ताक्षर मेल खाते हैं, तो संतान विधि मूल विधि को ओवरराइड करती है। ध्यान दें कि फील्डों को ओवरराइड नहीं किया जा सकता—केवल छिपाया जा सकता है।
Q6: यदि विरासत की गहराई बहुत अधिक हो जाती है, तो क्या होता है?
A6: गहरी विरासत पदानुक्रम कोड को समझना और बनाए रखना कठिन बना देते हैं। यह ट्रैक करना मुश्किल हो जाता है कि तर्क कहाँ परिभाषित है। बनाए रखने योग्य डिज़ाइन के लिए, विरासत की गहराई को उथला रखने का प्रयास करें और भूमिकाओं को स्पष्ट रूप से अलग रखें।
Q7: ओवरराइडिंग और ओवरलोडिंग के बीच क्या अंतर है?
A7: ओवरराइडिंग मूल वर्ग की विधि को संतान वर्ग में पुन: परिभाषित करती है। ओवरलोडिंग उसी क्लास में समान नाम वाली कई विधियों को परिभाषित करती है, लेकिन विभिन्न पैरामीटर प्रकारों या संख्याओं के साथ।
Q8: अमूर्त वर्गों और इंटरफेस का उपयोग अलग-अलग कैसे किया जाना चाहिए?
A8: अमूर्त वर्गों का उपयोग तब किया जाता है जब आप संबंधित वर्गों के बीच साझा कार्यान्वयन या फील्ड प्रदान करना चाहते हैं। इंटरफेस का उपयोग तब किया जाता है जब आप कई वर्गों द्वारा लागू किए जा सकने वाले व्यवहार अनुबंध परिभाषित करना चाहते हैं। साझा कोड के लिए अमूर्त वर्ग का उपयोग करें और जब कई प्रकारों का प्रतिनिधित्व करना हो या कई “क्षमताओं” की आवश्यकता हो, तो इंटरफेस का उपयोग करें।
