Why No Multiple Inheritance
Multiple inheritance क्या है
Multiple inheritance का मतलब एक class का एक साथ एक से ज़्यादा parents से inherit करना। कुछ languages इसे classes को allow करती हैं, पर Java नहीं — एक class सिर्फ़ एक class extend कर सकती है। हालाँकि, Java class को कई interfaces implement करने देती है, जो फ़ायदे सुरक्षित रूप से देता है।
Java इसे classes को क्यों रोकती है
class A { void show() { } }
class B { void show() { } }
// class C extends A, B { } // ERROR: allowed नहीं
Java एक class को दो classes extend करने से रोकती है। कारण diamond problem है: अगर दोनों parents की show() method हो, child नहीं बता सकती कौन-सी inherit करे। इसे रोकना यह confusion हटा देता है।
Diamond problem
सोचिए ऊपर class A, classes B और C दोनों A extend करती, और एक class D दोनों B और C extend करने की कोशिश करती — diamond आकार बनाकर। अगर B और C वही method अलग बदलें, D के पास दो टकराते versions और कोई साफ़ नियम न होगा। यही अस्पष्टता है जिसके लिए Java इसे classes को मना करती है।
Interfaces इसे हल करते हैं
interface Swimmer { void swim(); }
interface Walker { void walk(); }
class Duck implements Swimmer, Walker {
public void swim() { System.out.println("swimming"); }
public void walk() { System.out.println("walking"); }
}
एक class कई interfaces implement कर सकती है। चूँकि पारंपरिक interface methods की कोई body नहीं, कोई टकराव नहीं — class इकलौता implementation देती है। यह सुरक्षित रूप से type का multiple inheritance देता है।
Default methods
interface A { default void hi() { System.out.println("A"); } }
interface B { default void hi() { System.out.println("B"); } }
class C implements A, B {
public void hi() { // हल करने को override ज़रूरी
A.super.hi();
}
}
Java 8 से, interfaces में body वाली default methods हो सकती हैं। अगर दो interfaces एक साझा करें, class को override करना पड़ता है यह बताने को कौन-सी इस्तेमाल करे — तो यहाँ भी diamond problem नियंत्रित रहती है।
क्या इस्तेमाल करें
- एक parent का code चाहिए? → class extend कीजिए (single inheritance)।
- कई स्रोतों से capabilities चाहिए? → कई interfaces implement कीजिए।
- Class बिना साझा व्यवहार? → interface default methods इस्तेमाल कीजिए।
यह मेल classic multiple inheritance के ख़तरे बिना लचीलापन देता है।
आम गलतियाँ
- दो classes extend करने की कोशिश। Allowed नहीं — interfaces इस्तेमाल कीजिए।
- Default method टकराव हल न करना। साझा method को class में override कीजिए।
- "implements" को "extends" से मिलाना। Classes extend; interfaces implement होते हैं।
- यह भूलना class interfaces पूरी implement करती है। सारी interface methods define होनी चाहिए।
सारांश
- Java classes का multiple inheritance allow नहीं करती।
- कारण diamond problem की अस्पष्टता है।
- इसके बजाय एक class कई interfaces implement कर सकती है।
- Interfaces टकराव बचाते हैं क्योंकि उनकी methods (पारंपरिक रूप से) की कोई body नहीं।
- साझा default methods को, class टकराव हल करने को override करती है।
आगे, interfaces सीखिए abstraction और interfaces में, या single inheritance inheritance में।
