2012-04-19 20 views
37

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

  1. वह अपने तरीकों क्यों लागू करता है?
  2. कैसे वह अपने तरीकों को लागू कर सकते एक अंतरफलक एक विधि शरीर
  3. यह तरीकों कैसे लागू कर सकते हैं शामिल नहीं हो सकते जब जब यह अन्य इंटरफेस प्रदान करता है और इसे लागू नहीं?
  4. किसी अन्य इंटरफ़ेस को लागू करने वाले इंटरफ़ेस का उद्देश्य क्या है?

इसमें जावा में प्रमुख अवधारणाएं हैं!

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

public interface FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 
} 


public interface DragController extends FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 

    void dragEnd(); 

    void dragMove(); 
} 

ग्रहण में DragController में लागू तरीकों के अलावा लागू संकेत है।

और जब मैं माउस-होवर करता हूं, तो यह कहता है कि यह विधि लागू करता है !!!

+3

जब आप एक अंतरफलक आप केवल इसे करने के लिए जोड़ सकते हैं का विस्तार, यही कारण है कि आप करते हैं। इंटरफेस विधियों को लागू नहीं करते हैं। –

+4

मुझे डाउनवोट नहीं मिलता है। । । – GingerHead

उत्तर

45

यह अपने तरीकों को क्यों लागू करता है? एक इंटरफेस में विधि निकाय नहीं हो सकता है जब यह अपनी विधियों को कैसे कार्यान्वित कर सकता है? यह विधियों को कार्यान्वित कैसे कर सकता है जब यह अन्य इंटरफ़ेस को विस्तारित करता है और इसे कार्यान्वित नहीं करता है? एक और इंटरफ़ेस लागू करने वाले इंटरफ़ेस का उद्देश्य क्या है?

इंटरफ़ेस किसी अन्य इंटरफ़ेस के तरीकों को लागू नहीं करता है बल्कि उन्हें विस्तारित करता है। एक उदाहरण जहां इंटरफ़ेस विस्तार जरूरत है: विचार करें आप दो तरीकों moveForward और moveBack के साथ एक वाहन इंटरफेस है, लेकिन यह भी आप अंत में विमान जो एक वाहन लेकिन moveUp जैसे कुछ अतिरिक्त तरीकों के साथ है, moveDown तो को शामिल करने की जरूरत है आपके पास:

public interface IVehicle { 
    bool moveForward(int x); 
    bool moveBack(int x); 
}; 

और हवाई जहाज:

public interface IAirplane extends IVehicle { 
    bool moveDown(int x); 
    bool moveUp(int x); 
}; 
+0

तो, आप मूल रूप से 'IAirplane' नामक एक स्थान पर विधियों को जमा कर रहे हैं और आप वास्तव में विरासत में नहीं हैं। एक और मुद्दा यह है कि, मैं समझने के लिए 'IVehicle' के लेखक से पूछूंगा, क्यों इस इंटरफ़ेस' Ivehicle' को पहले से ही 'moveDown()' और 'moveBack()' पर विचार करने के लिए डिज़ाइन नहीं किया गया था, क्योंकि 'इंटरफ़ेस' मौजूदा सेट से खोजा गया है ठोस कक्षाएं (मुझे लगता है कि हवाई जहाज की अवधारणा उनकी पीढ़ी के हिस्से के रूप में उपलब्ध है)। पूरी तरह से, मुझे लगता है कि एक इंटरफेस का विस्तार मौजूदा खराब डिजाइन का एक परिणाम है, क्योंकि हम इस परिदृश्य में 'विस्तार' के उद्देश्य को तोड़ रहे हैं। – overexchange

+0

@overexchange इस मामले में कोई इंटरफ़ेस कक्षाओं से पहले डिज़ाइन नहीं किया गया है। इंटरफ़ेस एक कार्यक्षमता का वर्णन करता है हालांकि कक्षाएं असली दुनिया वस्तुओं का प्रतिनिधित्व करती हैं। कक्षाओं और बातचीत के बीच यह एक मुख्य अंतर है। MoveUp moveDown और इसी तरह के बारे में कोई नहीं। कोई भी वाहन आगे और पीछे जा सकता है हालांकि उनमें से सभी ऊपर और नीचे नहीं जा सकते हैं। विमान आगे बढ़ सकता है और ऊपर और नीचे भी जा सकता है लेकिन विभिन्न प्रकार के विमान इसे अलग तरीके से करेंगे। – AlexTheo

+0

जब आपने कहा था, तो मुझे यह नहीं मिला: 'इस मामले में इंटरफ़ेस कक्षाओं से पहले डिज़ाइन किया गया है।' किसी भी सॉफ्टवेयर डिज़ाइन के किसी भी मामले में, कंक्रीट कक्षाओं के डिज़ाइन के बाद इंटरफ़ेस की खोज की जाती है। – overexchange

6

विज्ञापन 1. यह इसके तरीकों को लागू नहीं करता है।

विज्ञापन 4. एक इंटरफेस का उद्देश्य का विस्तार, दूसरे को लागू नहीं करना, एक और विशिष्ट इंटरफ़ेस बनाना है। उदाहरण के लिए, SortedMap एक इंटरफ़ेस है जो Map बढ़ाता है। सॉर्टिंग पहलू में रुचि रखने वाला कोई ग्राहक Map के विरुद्ध कोड कर सकता है और उदाहरण के लिए TreeMap उदाहरण के सभी उदाहरणों को संभाल सकता है, जो SortedMap लागू करता है। साथ ही, सॉर्ट किए गए पहलू में रुचि रखने वाला कोई अन्य ग्राहक SortedMap इंटरफ़ेस के माध्यम से उसी उदाहरण का उपयोग कर सकता है।

आपके उदाहरण में आप superinterface से विधियों को दोहरा रहे हैं। कानूनी होने पर, यह अनावश्यक है और अंतिम परिणाम में कुछ भी नहीं बदलता है। संकलित कोड ठीक उसी होगा चाहे ये विधियां हों या नहीं। जो भी ग्रहण होवर कहता है वह मूल सत्य के लिए अप्रासंगिक है कि एक इंटरफ़ेस कुछ भी लागू नहीं करता है।

18

एक इंटरफ़ेस व्यवहार को परिभाषित करता है। उदाहरण के लिए, Vehicle इंटरफ़ेस move() विधि को परिभाषित कर सकता है।

ए कार एक वाहन है, लेकिन इसमें अतिरिक्त व्यवहार है। उदाहरण के लिए, Car इंटरफ़ेस startEngine() विधि को परिभाषित कर सकता है। चूंकि एक कार भी एक वाहन है, Car इंटरफ़ेस Vehicle इंटरफ़ेस बढ़ाता है, और इस प्रकार दो विधियों को परिभाषित करता है: move() (विरासत) और startEngine()

कार इंटरफ़ेस में कोई विधि कार्यान्वयन नहीं है। यदि आप एक वर्ग (वोक्सवैगन) बनाते हैं जो कार लागू करता है, तो उसे इसके इंटरफ़ेस के सभी तरीकों के लिए कार्यान्वयन प्रदान करना होगा: move() और startEngine()

एक इंटरफ़ेस किसी अन्य इंटरफ़ेस को लागू नहीं कर सकता है। यह केवल इसे बढ़ा सकता है।

+2

मैंने उन्हें उत्तर दिया है। 3 पहले प्रश्न समझ में नहीं आते हैं, क्योंकि एक इंटरफ़ेस किसी अन्य इंटरफ़ेस को लागू नहीं करता है, और इसमें कोई विधि कार्यान्वयन नहीं होता है। चौथे व्यक्ति का उत्तर मेरे उत्तर से दिया जाता है: यह अतिरिक्त व्यवहार/विधियों को प्रदान करने की अनुमति देता है। –

+2

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