क्या मुझे सीधे इंटरफ़ेस लागू करना चाहिए या सुपरक्लास करना चाहिए?


14

क्या इसमें कोई अंतर है

public class A extends AbstractB implements C
{...}

बनाम...

public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}

मैं समझता हूं कि दोनों मामलों में, क्लास ए इंटरफ़ेस के अनुरूप होगा। दूसरे मामले में, AbstractBइंटरफ़ेस विधियों के लिए कार्यान्वयन प्रदान कर सकता है C। क्या केवल यही अंतर है?

मैं में इंटरफ़ेस तरीकों से किसी के लिए एक कार्यान्वयन प्रदान करने के लिए नहीं करना चाहते हैं AbstractB , जो शैली मैं का उपयोग करना चाहिए ? क्या एक या दूसरे का उपयोग करने से कुछ छिपे हुए 'प्रलेखन' उद्देश्य होते हैं?


3
शीर्षक पर सुझाव: क्या मुझे सीधे इंटरफ़ेस लागू करना चाहिए या सुपरक्लास करना चाहिए
जेने बोयर्सकी

जवाबों:


20

यह सब AbstractB implements Cशब्दार्थ पर निर्भर करता है । यानी अगर इसे AbstractBलागू करने के लिए कोई अर्थ दिया जाता है C, तो इसके लिए जाएं।

यदि हम ठोस उदाहरण लेते हैं तो शब्दार्थ अंतर स्पष्ट हो जाता है।

अगर ए = डॉग, एब्सट्रैब = एनिमल, सी = आईबार्क

केवल विकल्प जो समझ में आता है

class Dog extends Animal implements IBark{

इसका कोई मतलब नहीं है, क्योंकि इसका मतलब यह होगा कि सभी जानवर भौंकते हैं।

class Animal implements IBark{

यदि आप से class Aविरासत में मिले हैं, तो अन्य अंतर खेलने में आते हैं AbstractB। # 1 में उन्हें C को लागू करने की आवश्यकता नहीं है, # 2 में वे सभी C को लागू करने के लिए मजबूर हैं।


1
+1 मेरे उत्तर से अधिक स्पष्ट है!
हाथ-ई-फूड

इसके अतिरिक्त, यदि इंटरफ़ेस था तो Heterotrophइसे Animalलागू करना उचित लगता है Heterotroph। यदि आप अन्य भौंकने वाले जानवरों की बहुत उम्मीद करते हैं और उन्हें उसी तरह से व्यवहार करना चाहते हैं, तो एक अन्य वर्ग BarkingAnimal extends Animal implements IBarkजाने का रास्ता होगा।
स्कारफ्रिज

@ स्कारफ्रिज वास्तव में मुझे उम्मीद है कि जानवर विस्तार करेंगे Heterotrophलेकिन आपके इनपुट के लिए धन्यवाद
कार्तिक टी

2

उचित वंशानुक्रम संबंध को निर्धारित करने का आसान तरीका स्वयं कक्षाओं को देखना नहीं है, बल्कि उन कक्षाओं में विधियों को कॉल करने वाले कोड पर है। अपने कोड में कहीं न कहीं आप की तरह कुछ है AbstractB b = new A();या otherObject.addAbstractB(this);। किसी भी तरह से, आप बाद में उस AbstractBसंदर्भ का उपयोग विभिन्न विधि कॉल करने के लिए करते हैं।

उस स्थिति में, क्या आप के तरीकों को कॉल करना चाहते हैं C? यदि ऐसा है, तो AbstractBलागू होना चाहिए C। यदि नहीं, तो ऐसा नहीं करना चाहिए। यदि आपके पास इस तरह की कोई स्थिति नहीं है, तो आपको विरासत की आवश्यकता नहीं है, और इसके बजाय रचना का उपयोग करने के लिए प्रतिक्षेपक होना चाहिए क्योंकि यह बहुत कम युग्मित है।


2

यह "छिपा हुआ" प्रलेखन उद्देश्य नहीं है। यह आपको एब्सट्रैक्ट को कास्ट करने की अनुमति देता है और यह सब सबक्लासेस से सी तक है। वास्तव में तीन स्टाइल हैं।

public class A extends AbstractB implements C
public class AbstractB

मैं इसे एक का उपयोग करूँगा यदि AbstractB तार्किक रूप से C. लागू नहीं करता है। भले ही यह विधियाँ प्रदान न करता हो, लेकिन इसका अर्थ हो सकता है। जैसे कि डॉग एनिमल इम्प्लीमेंट्स वैग को बढ़ाता है। यह वाग के लिए सभी जानवरों के लिए कोई मतलब नहीं है। ध्यान दें कि यह दृष्टिकोण वास्तव में AbstractB को कार्यान्वयन प्रदान करने से रोकता नहीं है।

public class A extends AbstractB
public AbstractB implements C

अगर मैं इंटरफ़ेस को लागू करने के लिए सभी उपवर्गों को चाहता था तो मैं इसका उपयोग करूंगा और ऐसा करने के लिए उन सभी को समझ में आता है। जैसे बीगल एब्सट्रैक्टडॉग इम्प्लांट्स वैग को बढ़ाता है।

public class A extends AbstractB implements C
public class AbstractB implements C

यह एक निरर्थक है, लेकिन स्पष्टता जोड़ सकता है।


मुझे लगता है कि "AbstractC" (जो प्रश्न में मौजूद नहीं है) को दूसरे पैराग्राफ में "AbstractB" में बदल दिया जाना चाहिए। मैं ऐसा करने के लिए संपादित नहीं कर सकता क्योंकि संपादकों को कम से कम 6 वर्ण होना चाहिए।
cellepo 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.