2013-08-20 3 views
10

में एकाधिक वंशानुक्रम व्याख्या करने के लिए वास्तव में सवाल साक्षात्कारकर्ताकैसे जावा

क्यू में से एक ने पूछ रहा था: आप कैसे कह सकते है कि जावा एकाधिक वंशानुक्रम समर्थन नहीं कर रहा है? यदि ऑब्जेक्ट क्लास जावा में सभी कक्षाओं का अभिभावक है।

मुझे उस प्रश्न का कोई जवाब नहीं है।

:-(

पूर्व कोई स्पष्ट जावा अवधारणाओं के बारे में विचार इसका मतलब है कि:।? सही अगर एक फैली बी

और यहाँ एक पहले से ही वस्तु वर्ग प्रदान कर रहा है अब कैसे अपने काम करता है

?

कृपया अपने उत्तरों को साझा करें ..

+0

सीधे आप केवल एक वर्ग का विस्तार कर सकते हैं - या इंटरफेस गुणा कर सकते हैं। काम के आसपास स्कैला देखें :) –

+0

यह सवाल बहुत व्यापक हो रहा है। और यहां कोई भी आपको जावा, ओप मूल बातें और संभावित विरोधी पैटर्न सिखा सकता है। – Leri

+3

एकाधिक विरासत एकाधिक- * प्रत्यक्ष *-विरासत के बारे में है। एक कक्षा वर्ग में दो तत्काल माता-पिता वर्ग नहीं हो सकते हैं। हालांकि, यह एक दादा वर्ग हो सकता है। 'ए बी बढ़ाता है' और 'बी सी बढ़ाता है, * * नहीं * जैसा कि ए बी और सी दोनों को बढ़ाता है। कारण यह अस्वीकृत नहीं है जब आपके पास कोई मामला है: 'ए बी और सी दोनों को बढ़ाता है,' बी बी बढ़ाता है, 'सी सी बढ़ाता है' - जब आप कहते हैं 'ए = नया ए(); a.someAbstractOrVirtualMethodOnD() '- क्या आप' डी' के 'बी 'कार्यान्वयन या' डी' के 'सी' कार्यान्वयन के बारे में बात कर रहे हैं? तो, जावा इसे प्रतिबंधित करता है। –

उत्तर

11

एकाधिक विरासत एकाधिक- प्रत्यक्ष-विरासत के बारे में है।

एक एकल वर्ग वर्ग दो तत्काल माता पिता कक्षाएं नहीं हो सकता। हालांकि, यह एक दादा वर्ग हो सकता है।

A extends B और B extends C, नहींA extends both B and C के समान है।

कारण इस की अनुमति नहीं है सादगी के लिए है आप की तरह एक मामला है जब:

A extends both B and C 

B extends D 

C extends D 

आप ऐसी स्थिति थी, और उसके बाद आप इस कोड था:

A a = new A(); 
a.someAbstractOrVirtualMethodOnD(); 

... क्या आप BsomeAbstractOrVirtualMethodOnD() के कार्यान्वयन के बारे में बात कर रहे हैं, या C उसी विधि के कार्यान्वयन के बारे में बात कर रहे हैं? किसको बुलाया जाना चाहिए? (संकेत: कोई अच्छा जवाब नहीं है)

तो, जावा इसे प्रतिबंधित करता है।

नोट, यदि आप implement एकाधिक इंटरफेस हैं तो आप एकाधिक विरासत की तरह कुछ प्राप्त कर सकते हैं। लेकिन चूंकि केवल एक ठोस कार्यान्वयन है, इसलिए कोई भ्रम नहीं है कि क्या कहा जाता है।

3

एकाधिक विरासत वह जगह है जहां एक वर्ग कई वर्गों से विस्तारित हो सकता है। यह संभव नहीं है जावा। यहाँ देखें: http://en.wikipedia.org/wiki/Multiple_inheritance

जब आप जावा में class A extends B करते हैं, तो A फैली B केवल, और नहीं Object। बदले में B (जो किसी और या है, जो अंततः वस्तु का विस्तार होगा) फैली हुई है Object

1

एकाधिक वंशानुक्रम एक वर्ग एक से अधिक माता पिता वर्गों के वारिस के लिए अनुमति चाहिए।

: के बाद से यह Diamond problem

Object वर्ग जा रहा है माता-पिता के बारे में

, और फिर वंशानुगत पदानुक्रम में कई वर्गों होने बना सकता है लेकिन जावा इस की अनुमति नहीं है, इसके Multi level inheritance

Sidenote के रूप में कहा

सी #multiple inheritance by interface बच्चे को कई माता-पिता के मेथ को लागू करने की अनुमति देकर अनुमति देता है ods अलग से भले ही उनके पास एक ही हस्ताक्षर

7

एकाधिक विरासत का अर्थ है कि एक वर्ग कई वर्गों से प्राप्त कर सकता है। दूसरी तरफ, इसमें कई अभिभावक वर्ग हो सकते हैं।

Object वर्ग उदाहरण साक्षात्कारकर्ता द्वारा उद्धृत के लिए, वहाँ दो संभावनाएं हैं:

  1. साक्षात्कारकर्ता खुद कई माता पिता वर्ग (एकाधिक वंशानुक्रम) और कई बच्चे वर्ग के बारे में उलझन में है।

  2. या वह उस सवाल का

एक मूल वर्ग का उपयोग कर कई बच्चे कक्षाओं में हो सकता है आपको धोखा देने का प्रयास कर रहा है और कहा कि बहु उत्तराधिकार से संबंधित नहीं है।

+0

उत्तर के लिए धन्यवाद। कृपया प्रश्न पूछें मैंने इसे उदाहरण के साथ संपादित किया है। –

1

इस संदर्भ लें: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

अन्य वर्गों इसकी वास्तव में कई नहीं विरासत को वस्तु वर्ग के मामले में ... जैसा कि कहा, इसकी जहां एक ही वर्ग कई वर्गों से विस्तार कर सकते हैं ..

3

केवल जावा में पारस्परिक विरासत की समानता Interfaces है। एक कक्षा कई इंटरफेस लागू कर सकती है।

Object कक्षा एकाधिक विरासत का एक उदाहरण नहीं है। क्या आप इस सवाल का गलत व्याख्या कर सकते हैं।

4

इस StackOverflow जवाब पर एक नज़र डालें: https://stackoverflow.com/a/9790475/2619912

आपका वर्ग कि है कि अन्य वर्ग फैली हुई है, लेकिन यह वस्तु भी फैली हुई है, तो आप, विरासत में से एक लाइन नहीं दो में अब भी कर रहे हैं।

8

सब के शीर्ष पर भाषा डिजाइन सरल

और उदाहरण blog से मैं नियमित रूप से पालन रखने के लिए।

enter image description here

1) हम दो वर्गों बी और सीएक से इनहेरिट की है।

2) मान लें कि बी और सी एक विरासत विधि अधिभावी कर रहे हैं और वे अपने स्वयं के कार्यान्वयन प्रदान करते हैं।

3) अब दोनों बी और सी से डी inherits एकाधिक वंशानुक्रम कर। डी उस ओवरराइड विधि का उत्तराधिकारी होना चाहिए, जिस पर ओवरराइड विधि का उपयोग किया जाएगा? क्या यह बी या सी से होगा?

यहां हमारे पास अस्पष्टता है।

किसी भी इस पर काबू पाने के लिए तरीके हम इंटरफेस और बहुस्तरीय विरासत है।

संपादित करें:

And here A is already extending Object class. 

कि के रूप में Multiple inheritance .कि कहा जाता है कभी नहीं है Multi level inheritance.

मल्टी स्तर में कहा जाता है,

कई कक्षाओं inheritance में शामिल कर रहे हैं, लेकिन एक वर्ग केवल one फैली हुई है। सबसे कम subclass अपने सभी super classes 'सामग्री का उपयोग कर सकते हैं।

+1

धन्यवाद .. सुरेश +1 –

+0

खुशी, इससे मदद मिली। आपका स्वागत है :) –

1

एक जावा वर्ग केवल एक ही माता पिता के वर्ग का एक सीधा बच्चा हो सकता है। इसमें दादा हो सकता है लेकिन कोई दूसरा माता-पिता नहीं हो सकता है। यह एक जैविक मां होने जैसा है। आपके पास एक से अधिक जैविक माताओं नहीं हो सकते हैं, सुनिश्चित करें कि आप दादी हो सकते हैं।

1

वहाँ एक वर्ग एक और वर्ग बी हो चलो अब हम एक वर्ग व्युत्पन्न परिभाषित करते हैं। एकाधिक विरासत का अर्थ है: कक्षा व्युत्पन्न कक्षा ए और कक्षा बी दोनों का उत्तराधिकारी हो सकता है लेकिन जावा में यह संभव नहीं है। इसलिए यह एकाधिक विरासत का समर्थन नहीं करता है।

2

उत्तर जावा है बहु-स्तर की विरासत का समर्थन करता है लेकिन एकाधिक विरासत नहीं।

3

यह जावा के साथ एक आम गलतफहमी है।

रास्ता बहु उत्तराधिकार (C++ और अजगर) काम करता है कुछ इस तरह है।

Parent1 Parent2 Parent3 
    |   |   | 
    _______________________ 
       | 
       v 
      Child 

इसका मतलब है कि Child सभी माता-पिता से विशेषताओं और विधियों का उत्तराधिकारी होगा।

हालांकि, जावा में, विरासत इस तरह काम करती है।

Object 
    | 
    v 
    Child1 
    | 
    v 
    Grandchild 

तो, वस्तु सभी वर्गों के सुपर क्लास है, लेकिन यह सभी वर्गों के तत्काल जनक नहीं है। जावा करता है, लेकिन कुछ हद तक अब Interfaces

Object 
    | 
    v 
Child <--- Interface 
    | 
    v 
Grandchild 

के माध्यम से एकाधिक वंशानुक्रम लागू करने के लिए एक तरीका प्रदान, Grandchild जो, बारी में तरीकों इंटरफ़ेस में निर्धारित [जब तक यह है को लागू करने के लिए बाध्य है Child से तरीकों प्राप्त कर लेंगे एक अमूर्त वर्ग है, लेकिन वह अलग चर्चा है कुल मिलाकर]

तो, वस्तु सभी वर्गों का पूर्वज है, लेकिन यह सभी वर्गों के माता-पिता नहीं है, और जावा, इसलिए नहीं समर्थन एकाधिक वंशानुक्रम करता है।

1

प्रश्न: आप कैसे कह सकते हैं कि जावा एकाधिक विरासत का समर्थन नहीं कर रहा है? यदि ऑब्जेक्ट क्लास जावा में सभी कक्षाओं का अभिभावक है।

वस्तु सभी वर्गों (पिता, दादा, परदादा, आदि) का पूर्वज है लेकिन हर वर्ग से केवल एक पिता है (यदि निर्दिष्ट नहीं है, यह वस्तु वर्ग है)।

0

पहला मामला: आप विरासत का उपयोग किए बिना एक वर्ग एक बनाने के मान लीजिए। डिफ़ॉल्ट रूप से, यह ऑब्जेक्ट क्लास से लिया गया है।

दूसरा मामला: आप क्लास B कि फैली वर्ग ए क्लास ए वस्तु वर्ग से सभी क्षेत्रों में शामिल है बनाने के मान लीजिए, तो वर्ग बी भी विरासत के माध्यम से उन्हें शामिल होंगे। यह class B extends A(which extends Object) है, इसलिए आप कह सकते हैं कि बी ए के लिए एक उप-वर्ग है और ऑब्जेक्ट के लिए भी है।