2010-10-13 13 views
84

क्या मेरा मतलब है:एक इंटरफ़ेस अन्य इंटरफ़ेस को कार्यान्वित क्यों नहीं कर सकता है?

interface B {...} 

interface A extends B {...} // allowed 

interface A implements B {...} // not allowed 

मैं इसे googled और मैं this पाया:

implements अर्थ है एक अंतरफलक के तरीकों के लिए एक कार्यान्वयन को परिभाषित। हालांकि इंटरफेस में कोई कार्यान्वयन नहीं है, इसलिए यह संभव नहीं है।

हालांकि, इंटरफेस एक 100% अमूर्त वर्ग है, और एक सार वर्ग अपनी विधियों को लागू किए बिना इंटरफेस (100% अमूर्त वर्ग) को कार्यान्वित कर सकता है। जब यह "इंटरफेस" के रूप में परिभाषित किया जाता है तो समस्या क्या होती है?

विवरण में,

interface A { 
    void methodA(); 
} 

abstract class B implements A {} // we may not implement methodA() but allowed 

class C extends B { 
    void methodA(){} 
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B 

उत्तर

90

implements, कार्यान्वयन का मतलब है जब interface घोषित करने के लिए सिर्फ interface नहीं प्रदान करने के लिए कार्यान्वयन के लिए है।

एक 100% abstract class कार्यात्मक एक interface के बराबर है, लेकिन यदि आप, (इस मामले में यह 100% abstract नहीं रहेगी) इच्छा तो JVM के नजरिए से वे अलग बातें हैं यह भी कार्यान्वयन हो सकता है।

इसके अलावा 100% अमूर्त वर्ग में सदस्य चर के पास कोई एक्सेस क्वालीफायर हो सकता है, जहां एक इंटरफ़ेस में वे public static final निहित हैं।

+4

जावा 8 के रूप में, इंटरफेस डिफ़ॉल्ट तरीकों हो सकता है, उन्हें भी बहुत कुछ है कि संबंध में सार वर्गों के समान बनाने:

public abstract class MyAbstractClass { public abstract void abstractMethod(); } 

यहाँ MyAbstractClass का एक उदाहरण उपवर्ग है। – forresthopkinsa

+0

अंतिम वाक्य के लिए धन्यवाद! –

22

implements का अर्थ है कि व्यवहार को abstract विधियों (स्पष्ट रूप से सार वर्गों को छोड़कर) के लिए परिभाषित किया जाएगा, आप कार्यान्वयन को परिभाषित करते हैं।

extends का अर्थ है कि एक व्यवहार विरासत में मिला है।

इंटरफेस के साथ यह कहना संभव है कि एक इंटरफ़ेस में एक जैसा व्यवहार होना चाहिए, यहां तक ​​कि वास्तविक कार्यान्वयन भी नहीं है। यही कारण है कि यह एक इंटरफ़ेस के लिए extends इसे लागू करने के बजाय एक और इंटरफ़ेस के लिए अधिक समझ में आता है।


एक तरफ ध्यान दें पर, याद है कि भले ही एक abstract वर्ग abstract विधियों (समझदार तरीका एक अंतरफलक करता है) को परिभाषित कर सकते हैं, यह अभी भी एक वर्ग है और अभी भी प्राप्त की जा करने के लिए है (विस्तारित) और नहीं कार्यान्वित किया।

4

संकल्पनात्मक रूप से दो "डोमेन" वर्ग और इंटरफेस हैं। इन डोमेन के अंदर आप हमेशा विस्तार कर रहे हैं, केवल एक वर्ग एक इंटरफ़ेस लागू करता है, जो कि "सीमा पार करना" है। इसलिए इंटरफेस के लिए मूल रूप से "विस्तार" कक्षाओं के व्यवहार को प्रतिबिंबित करता है। कम से कम मुझे लगता है कि यह पीछे तर्क है। ऐसा लगता है कि हर कोई इस तरह के तर्क से सहमत नहीं है (मुझे लगता है कि यह थोड़ा सा खुद को समझता है), और वास्तव में दो अलग-अलग कीवर्ड होने का कोई तकनीकी कारण नहीं है।

+0

यदि "वाई एक्स बढ़ाता है" और मुहरबंद नहीं है, तो संभव है कि एक और प्रकार "जेड" हो जो "वाई" फैलाता हो। यह सच होगा कि एक्स एक इंटरफ़ेस या कक्षा है या नहीं। यदि "डब्ल्यू लागू करता है एक्स", तो, "वी लागू करता है" होना संभव नहीं है। तथ्य यह है कि "विस्तार" किया जा सकता है "जंजीर" और "उपकरण" अलग-अलग कीवर्ड रखने के लिए एक अच्छे कारण की तरह नहीं लग सकता है। – supercat

-5

इंटरफ़ेस वह वर्ग है जिसमें एक सार तत्व है जो कोई ऑब्जेक्ट नहीं बना सकता है। चूंकि इंटरफेस ऑब्जेक्ट नहीं बना सकता है और यह शुद्ध वर्ग नहीं है, इसका कोई मूल्य लागू नहीं होता है।

2

हालांकि, इंटरफ़ेस 100% अमूर्त वर्ग और अमूर्त वर्ग है कर सकते हैं औजार इंटरफेस (100% अमूर्त वर्ग) ने अपने तरीकों को लागू करने के बिना। जब यह "इंटरफेस" के रूप में परिभाषित किया जाता है तो समस्या क्या होती है?

यह केवल सम्मेलन का विषय है। जावा भाषा के लेखकों ने फैसला किया कि "विस्तार" इस ​​संबंध का वर्णन करने का सबसे अच्छा तरीका है, इसलिए हम सभी इसका उपयोग करते हैं।

सामान्य रूप से, हालांकि एक इंटरफेस "100% अमूर्त वर्ग" है, हम उनके बारे में ऐसा नहीं सोचते हैं। हम आमतौर पर कक्षाओं के बजाय कुछ महत्वपूर्ण तरीकों को लागू करने के वादे के रूप में इंटरफेस के बारे में सोचते हैं। और इसलिए हम वर्गों की तुलना में इंटरफेस के लिए अलग-अलग भाषा का उपयोग करते हैं।

अन्य लोगों के अनुसार, "उपकरण" पर "विस्तार" चुनने के अच्छे कारण हैं।

+0

येसिर। यह सम्मेलन का मामला है। बहुत से लोग _logically_ सूर्य की मूल जावा भाषा की बाधाओं को औचित्य देने का प्रयास करते हैं, जब यह केवल व्यक्तिगत दृष्टिकोण है। क्या कंपाइलर ने "उपकरण" इंटरफेस को जोड़ दिया है, मुझे लगता है कि वही लोग इसे भी उचित ठहराते हैं। :-) –

1

आशा है कि यह आपके कॉलेज के दौरान ओप्स (कोर जावा) में जो कुछ मैंने सीखा है, उससे आपकी मदद करेगा।

कार्यान्वयन इंटरफ़ेस के तरीकों के लिए कार्यान्वयन को परिभाषित करने का संकेत देता है। हालांकि इंटरफेस में कोई कार्यान्वयन नहीं है, इसलिए यह संभव नहीं है। एक इंटरफ़ेस हालांकि एक और इंटरफ़ेस बढ़ा सकता है, जिसका अर्थ है कि यह और विधियों को जोड़ सकता है और इसके प्रकार का वारिस कर सकता है।

यहां एक उदाहरण दिया गया है, यह मेरी समझ है और मैंने ओप्स में क्या सीखा है।

interface ParentInterface{ 
     void myMethod(); 
} 

interface SubInterface extends ParentInterface{ 
     void anotherMethod(); 
} 

और एक इंटरफेस एक मन में एक बात रखने के केवल एक और इंटरफ़ेस विस्तार कर सकते हैं और आप इसे कुछ वर्ग नीचे

public interface Dog 
{ 
    public boolean Barks(); 

    public boolean isGoldenRetriever(); 
} 

कार्यान्वित जैसे में तो केवल एक इंटरफेस पर समारोह है परिभाषित करने के लिए अब, अगर चाहते हैं एक वर्ग इस इंटरफ़ेस को लागू करने थे, यह क्या यह कैसा दिखेगा है:

public class SomeClass implements Dog 
{ 
    public boolean Barks{ 
    // method definition here 

    } 

    public boolean isGoldenRetriever{ 
    // method definition here 
    } 
} 

और कुछ अमूर्त समारोह को परिभाषित करने और यह घोषणा करते हैं एक अमूर्त वर्ग है और आप उन को परिभाषित करना चाहते च एकीकरण या आप उन कार्यों को लागू कर सकते हैं तो आप उस कक्षा को विस्तारित करने का मानते हैं क्योंकि अमूर्त वर्ग केवल बढ़ाया जा सकता है। यहां नीचे उदाहरण है।

public class MySubClass extends MyAbstractClass { 

    public void abstractMethod() { 
     System.out.println("My method implementation"); 
    } 
} 
संबंधित मुद्दे