2010-08-20 16 views
43

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

+2

के संभावित डुप्लिकेट [क्यों हम इंटरफेस को कार्यान्वित कर रहे हैं?] (http://stackoverflow.com/questions/1583654/why-we-are-implementing-interfaces) – Thilo

+0

इसके अलावा एक अच्छी व्याख्या [यहां] (http://programmers.stackexchange.com/a/ 131334/146150)। –

उत्तर

40

मैं कहूंगा कि मुख्य उपयोग बहुरूपता है, या कई अलग-अलग वस्तुओं पर एक ही ऑपरेशन करने की क्षमता है। यदि विभिन्न ऑब्जेक्ट्स सभी एक ही इंटरफ़ेस को लागू करते हैं और एक ही विधि रखते हैं, तो आप उन सभी ऑब्जेक्ट्स को वेक्टर में स्टोर कर सकते हैं, उदाहरण के लिए, और वेक्टर के माध्यम से उस विधि को कॉल करने के माध्यम से पुनरावृत्त कर सकते हैं।

+2

रोब मैं आपके साथ सहमत हूं लेकिन मैं इसे कक्षा विस्तार से इंटरफ़ेस प्राप्ति की अवधारणा को अलग करके जोड़ता हूं (जो वास्तव में सी ++ में संघर्ष करता है) आप एकाधिक विरासत के बिना बहुरूपता प्राप्त कर सकते हैं – Sindico

5

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

उदाहरण के लिए, ऑब्जेक्ट्स की तुलना की जा सकती वस्तुओं को ऑब्जेक्ट पदानुक्रम पर कहीं भी कहीं भी हो सकता है - उन्हें एक सामान्य पूर्वजों की तुलना करने की आवश्यकता नहीं है, जिनकी तुलना की जा सकती है। String एस की तुलना की जा सकती है, Integer एस की तुलना की जा सकती है, आप अपनी खुद की Frame एस भी बना सकते हैं, इसकी तुलना की जा सकती है (कहें, एक फ्रेम फ्रेम से "कम" है, यदि यह अग्रभूमि में अधिक है - यानी यदि यह ओवरले करेगा अन्य फ्रेम)। इस प्रकार, यदि आप किसी ऐसी चीज को संदर्भित करना चाहते हैं जिसकी तुलना की जा सकती है, तो आपको सबसे सामान्य पूर्वजों के साथ एक चर घोषित करने के लिए मजबूर होना होगा - इस मामले में, Object। यह बहुत सामान्य है, क्योंकि तब यह उन मानों को भी प्राप्त कर सकता है जो तुलनात्मक नहीं हैं (और जब आप उनकी तुलना करने का प्रयास करते हैं तो त्रुटियां फेंक देंगे)।

इस प्रकार, इंटरफ़ेस Comparable: यह सभी वर्गों कि तुलना कार्यक्षमता भर उपवर्ग सुपर क्लास-पदानुक्रम लागू चयन करता है।

13

इन प्रतिक्रियाओं के अतिरिक्त मैं कहूंगा कि इंटरफेस के लिए सबसे महत्वपूर्ण उपयोग आपके सॉफ़्टवेयर में घटकों के बीच युग्मन को कम करना है।

एक इंटरफ़ेस कक्षाओं के बीच एक समझौते का प्रतिनिधित्व करने की अनुमति देता है कि वे वास्तविक कार्यान्वयन से बंधे बिना एक दूसरे से कैसे बात करेंगे।

यह संकलित कोड को बदले बिना दूसरों द्वारा कार्यान्वयन को बदलने (परीक्षण के लिए बहुत उपयोगी, या उपयोग मामलों को बदलने) की अनुमति देता है।

-1

कुछ कोड इसके बिना संकलित नहीं होंगे।

उदाहरण के लिए, में:

for (String name : list) 
{ 
    System.out.print("\nIn foreach loop: name: " + name); 
} 

listjava.lang.Iterable interface को लागू करना चाहिए।

+5

यह अनिवार्य रूप से वही है जैसा कि आपको कुछ उपयोग करने की आवश्यकता है क्योंकि हम यह करना है। यह ** पर्याप्त रूप से ** प्रश्न का उत्तर नहीं देता है। – rayryeng

+0

मुझे पता है कि। मैं बस यह इंगित कर रहा हूं कि हमें इस मामले में उनका उपयोग करना होगा, चाहे हम इसे पसंद करते हैं या नहीं। मैं इसे पी.सी. को इकट्ठा करने के समान समझा जाना पसंद करता हूं .: हार्डवेयर कनेक्टर्स के बीच कुछ अनुरूपता के बिना, बिजली आपूर्ति या हार्ड डिस्क जैसे किसी हिस्से को प्रतिस्थापित करना बहुत कठिन होगा यदि वे अदला-बदले नहीं थे। यदि यह पर्याप्त रूप से प्रश्न का उत्तर नहीं देता है, तो मुझे लगता है कि कम से कम यह लोगों को समझने में मदद करता है कि वे उपयोग क्यों कर रहे हैं। –

27

मैं यह भी सोच रहा था कि इंटरफेस का उपयोग कैसे किया जाता है। मुझे आशा है कि इससे दूसरों की मदद मिलेगी:

एक इंटरफ़ेस एक अनुबंध (या प्रोटोकॉल, या एक सामान्य समझ) कक्षाओं के क्या कर सकता है। जब कोई वर्ग एक निश्चित इंटरफ़ेस लागू करता है, तो यह इंटरफ़ेस में घोषित सभी सार विधियों को कार्यान्वित करने का वादा करता है। इंटरफ़ेस सामान्य व्यवहारों का एक सेट परिभाषित करता है। इंटरफ़ेस लागू करने वाले वर्ग इन व्यवहारों से सहमत हैं और व्यवहारों के लिए अपना स्वयं का कार्यान्वयन प्रदान करते हैं। यह आपको वास्तविक कार्यान्वयन के बजाय इंटरफ़ेस पर प्रोग्राम करने की अनुमति देता है। इंटरफेस के मुख्य उपयोग में से एक दो वस्तुओं के बीच संचार अनुबंध प्रदान करता है।यदि आपको कक्षा एक इंटरफ़ेस लागू करता है, तो आप जानते हैं कि उस श्रेणी में कंक्रीट उस इंटरफ़ेस में घोषित विधियों के कार्यान्वयन शामिल हैं, और आप इन विधियों को सुरक्षित रूप से इनकार करने में सक्षम होने की गारंटी देते हैं। दूसरे शब्दों में, दो ऑब्जेक्ट्स उनके विशिष्ट कार्यान्वयन के बजाय इंटरफ़ेस में परिभाषित अनुबंध के आधार पर संवाद कर सकते हैं।

दूसरा, जावा एकाधिक विरासत का समर्थन नहीं करता है (जबकि सी ++ करता है)। एकाधिक विरासत आपको एक प्रत्यक्ष सुपरक्लास से अधिक से सबक्लास प्राप्त करने की अनुमति देती है। यदि कोई प्रत्यक्ष सुपरक्लास के विरोधाभासी कार्यान्वयन होते हैं तो यह एक समस्या उत्पन्न करता है। ( उपclass में कौन सा अनुसरण करना है?)। हालांकि, एकाधिक विरासत में इसकी जगह है। जावा आपको इंटरफेस से अधिक "लागू" करने की अनुमति देकर करता है (लेकिन आप केवल एक सुपरक्लास से "विस्तारित" हो सकते हैं)। चूंकि इंटरफ़ेस में वास्तविक कार्यान्वयन के बिना केवल अमूर्त विधियां हैं, इसलिए कई इंटरफेस के बीच कोई संघर्ष नहीं हो सकता है। (इंटरफ़ेस स्थिरांक पकड़ सकते हैं, लेकिन अनुशंसित नहीं है एक उपवर्ग परस्पर विरोधी स्थिरांक साथ दो इंटरफेस, संकलक इच्छा झंडा बाहर एक संकलन त्रुटि को लागू करता है।।) से

: http://www.ntu.edu.sg/home/ehchua/programming/java/J3b_OOPInheritancePolymorphism.html#zz-6.6

+0

क्या आपके इंटरफेस में 'इंटरफेस तुलनात्मक' का उद्देश्य कैप्चर किया गया है? – overexchange

संबंधित मुद्दे