2010-12-29 6 views
14

मेरे पास एक इंटरफ़ेस Interface1 है। मेरे पास कार्यान्वयन Imple implements Interface1 है (सभी विधियां लागू की गई हैं :))।यदि मैं एक इंटरफेस विधि कहता हूं, तो क्या यह विधि निकाय वर्ग से विधि निकाय प्राप्त करेगा और निष्पादित करेगा?

अब, एक तृतीय श्रेणी के CheckCall पर विचार मैं कक्षा CheckCall में एक कॉल कर सकते हैं जैसे मैं नीचे उल्लेख:

Interface1 interface1; 
interface1.method(); 

सभी आवश्यक आयात किया गया है। कृपया मुझे बताएं कि यह संभव है या नहीं, अगर नहीं तो ठीक है और यदि हां, तो मुझे बताएं कि क्या होगा यदि मेरे पास एक ही इंटरफेस के लिए एक से अधिक कार्यान्वयन कक्षाएं हैं और मैं वही कॉल कर रहा हूं।

उत्तर

14

ठीक है, आप इंटरफेस पर सीधे विधि कॉल नहीं कर सकते हैं, लेकिन आप यह कर सकते हैं आप क्या लिखा है, और अधिक या कम है।

आप ने लिखा है:

Interface1 interface1 = new CheckCall(); 
interface1.method(); 

तो मुझे बताओ अगर मैं उसी के लिए एक से अधिक impl श्रेणियां होती हैं कि क्या होगा:

Interface1 interface1; 
interface1.method(); 

यह यदि आप ऐसा करते काम करेंगे इंटरफ़ेस और मैं वही कॉल कर रहा हूं

ठीक है, कि जावा के बारे में अच्छी बात यह है है: समस्या आप की बात कर रहे हैं "हीरे समस्या" कहा जाता है:

http://en.wikipedia.org/wiki/Diamond_problem

और यह वास्तव में जावा में मौजूद नहीं है क्योंकि जावा पूरी तरह से बहु उत्तराधिकार का समर्थन करता है , लेकिन केवल "एकाधिक (जावा) इंटरफ़ेस विरासत" (* टिप्पणी देखें) के माध्यम से।

तो आपके मामले में जब आप interface1.method() पर कॉल करते हैं तो आप या तो Impl की विधि या CheckCall की विधि को कॉल कर रहे हैं और कोई भ्रम संभव नहीं है।

+0

एकाधिक वंशानुक्रम के बारे में, ** किसी भी ** OOA/OOD सफाई से केवल "इंटरफेस विरासत" का उपयोग जावा में OOP में अनुवाद किया जा सकता है। हेक, किसी भी ओओए/ओओडी को एक भाषा में अनुवादित किया जा सकता है जिसमें * "कार्यान्वयन विरासत" * की अवधारणा भी नहीं होगी (जिसे * कोड पुन: उपयोग * * के रूप में भी जाना जाता है, जो वास्तव में ओओ के साथ बहुत कुछ नहीं करता है) । फिर भी कुछ लोग समझ में नहीं आते कि जावा पूरी तरह से एमआई का समर्थन करता है ... :( – SyntaxT3rr0r

+0

ठीक है, तो आपके उत्तर को उन सभी अन्य उत्तरों से अलग कैसे किया जाता है जिन्हें आपने स्पष्ट रूप से डाउनवॉटेड किया था? क्योंकि मैं अंतर नहीं बता सकता, इसके अलावा विकी लिंक जो आप जोड़ते हैं। –

+0

@ सेन पैट्रिक फ़्लॉइड: लोग एसओ पर जवाब दे सकते हैं? – SyntaxT3rr0r

0

नहीं, आपको उस ऑब्जेक्ट पर कॉल करने की आवश्यकता है जो इंटरफ़ेस को लागू करता है, इंटरफ़ेस पर नहीं।

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

5

हां, लेकिन जैसा आपने लिखा है उतना नहीं। आप कहते हैं कि करना होगा:

Interface1 interface1 = new Imple(); 

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

List<String> a = new ArrayList<String>(); 
0

सं

आप एक इंटरफेस instanciate नहीं कर सकते हैं, आप एक Imple वस्तु बनाने के लिए होगा एक के रूप में उपयोग करने के लिए Interface1 एक इस तरह:

Interface1 interface1 = new Imple(); 

interface1.method(); 
वास्तव में

, एक अंतरफलक मुख्य ब्याज एक विधि किसी भी वस्तु लागू लौटने के लिए, दिए गए कार्यान्वयन के बारे में चिंता किए बिना की क्षमता से आते हैं। आपके मामले में, यह

public class CheckCall { 
    public Interface1 factoryMethod() { 
     return new Imple(); 
    } 

    public void test() { 
     Interface1 used = factoryMethod(); 

     used.method(); 
    } 
} 
1

असल में, आप इंटरफेस है कि उन्हें परिभाषित द्वारा तरीकों का उल्लेख करना चाहिए के रूप में दिखाई सकता है, लेकिन आप एक वास्तविक को लागू करने वर्ग की जरूरत है। तो मैं इसे इस तरह आम तौर पर करना होगा:

// the variable is of type Interface1 
Interface1 interface1 = new Imple(); 
// but the method will be executed on the Imple object 
interface1.method(); 
7

निश्चित रूप से, आपका कोड ठीक काम करता है! आपको वास्तविक परिवर्तनीय (यानी नया इम्प्ले()) के साथ अपने चर interface1 को प्रारंभ करना होगा। इस उदाहरण

चेक बाहर, मैं अपने वर्ग के नाम का इस्तेमाल किया:

public class CheckCall { 

    interface Interface1 { 
     void method(); 
    } 

    static class Imple implements Interface1 { 
     @Override 
     public void method() { 
      System.out.println("Imple.method1()"); 
     } 
    } 

    public static void main(String[] args) { 
     Interface1 interface1; 
     interface1 = new Imple(); 
     interface1.method(); 
    } 

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