2012-01-12 15 views
8

एक मौजूदा समस्या में मुझे (printing a file to a physical printer in Java) मैं पागल आदमी की तरह कोड के माध्यम से चला रहा हूं जो प्रत्येक वर्ग के जावडोक से किसी भी उपयोगी मिस्ड जानकारी को भस्म करने की कोशिश कर रहा है।इंटरफेस शुरू करना?

अब, मैंने पिछले प्रश्नों से इस कोड का थोड़ा सा खींच लिया है, इसलिए मैंने थोड़ा सा लिखा नहीं था। मैंने जो मुद्दा देखा है वह यह है कि मैंने जो कोड पकड़ा है वह एक ऑब्जेक्ट शुरू कर रहा है, "सरल डॉक" कहता है जो एक इंटरफ़ेस (डॉक्टर) लागू करता है और इसे उस इंटरफ़ेस को असाइन करता है ?!

लिटिल कोड स्निपेट:

Doc mydoc = new SimpleDoc(textStream, flavor, null); 

अब जहाँ तक मैं नेतृत्व किया था समझने के लिए जावा में हम वस्तुओं को बनाने के। मैं विरासत से परिचित हूं, और मैं कक्षाओं को कई सुपर क्लास "वारिस" करने की अनुमति देने के लिए इंटरफेस का उपयोग करने की चाल से परिचित हूं।

लेकिन यह सिर्फ सही चिपक नहीं रहा है। आप एक कक्षा बना सकते हैं जो एक इंटरफ़ेस लागू करता है, जो मेरे साथ ठीक है। लेकिन जब इंटरफेस बनाया जाता है और ऑब्जेक्ट कम हो जाता है तो ऑब्जेक्ट कम हो जाता है? जब मैं mydoc का संदर्भ देता हूं तो मैं क्या एक्सेस कर रहा हूं?

+2

mydoc किसी ऑब्जेक्ट का संदर्भ है जो 'Doc' इंटरफ़ेस लागू करता है। इस स्थिति में, इंटरफ़ेस का उपयोग उन विधियों की पहचान करने के लिए किया जाता है जिन्हें Mydoc संदर्भ चर के माध्यम से बुलाया जा सकता है। ध्यान दें कि परिवर्तनीय (mydoc) अभी भी किसी ऑब्जेक्ट का संदर्भ है। – DwB

उत्तर

5

चाल यह जानना है कि आप "बनाना", "तत्काल" या "प्रारंभिक" इंटरफेस नहीं कर रहे हैं। आप बस एक वैरिएबल को परिभाषित कर रहे हैं जैसे कि आप इंटरफ़ेस को लागू करते हैं।

आप अनिवार्य रूप से है कि इस विधि से बाकी के लिए, आप केवल इस तथ्य में रुचि है कि myDoc एक Doc (जैसे कि, कुछ है कि Doc इंटरफेस को संतुष्ट करता है) है इस कोड पर काम कर रहे अन्य प्रोग्रामर कह रहे हैं। यह प्रोग्रामिंग को सरल बना सकता है क्योंकि आईडीई के ऑटो-पूर्ण अब आपको केवल SimpleDoc ऐसा करने में सक्षम है, इस इंटरफ़ेस द्वारा परिभाषित विधियों को दिखाएगा।

कल्पना कीजिए कि आप अपने भविष्य की कार्यक्षमता का विस्तार करना चाहते में इतना है कि आप कुछ इनपुट के आधार पर डॉक्टर के विभिन्न कार्यान्वयन हो सकता था। स्पष्ट रूप से SimpleDoc बनाने के बजाय, आप कहते हैं:

Doc mydoc = docFactory.getByType(inputType); 

docFactoryDoc किसी भी प्रकार का उत्पादन कर सकते हैं, और इस विधि वास्तव में परवाह नहीं है कि किस तरह की instantiated हो जाता है, क्योंकि यह एक Doc है जैसे कि यह परवाह किए बिना इलाज के लिए जा रहा है।

+0

एक और बड़ा फायदा। यदि आप भविष्य में, कॉम्प्लेक्सडॉक या MySuperOptimizedDoc का उपयोग करने के लिए निर्णय लेते हैं, तो आपको केवल कोड की एक पंक्ति के दाईं ओर बदलने की आवश्यकता है। – user949300

+0

@ user949300: ठीक है, कोड की एक पंक्ति के दाएं * और बाएं * पक्षों को तर्कसंगत रूप से बदलना इतना कठिन नहीं है। लेकिन पहली जगह एक इंटरफेस में प्रोग्रामिंग करके, आप डेवलपर्स को 'सरल डॉक' पर कॉलिंग विधियों को शुरू करने के लिए आमंत्रित नहीं करते हैं जो हर दूसरे प्रकार के 'डॉक्टर' पर नहीं किया जा सकता है। जैसा कि आप इंगित करते हैं, यह डॉक प्रकार में परिवर्तन होने पर आपको प्रदर्शन करने की आवश्यकता को कम करने में मदद करता है। – StriplingWarrior

+0

धन्यवाद, यह अब बहुत स्पष्ट है! मैंने इस अभ्यास को किसी वस्तु के उपयोग को और स्पष्ट करने में मदद करने के तरीके के बारे में जानकारी प्राप्त की, जो वास्तव में इस तरह के कुछ अभ्यासों का उपयोग करने के लिए मांस को मदद करता है। – Alex

4

आप इंटरफेस नहीं बना सकते, क्या आप यहाँ कर आप वर्ग SimpleDoc जो इंटरफेस Doc लागू करता है की एक वस्तु mydoc पैदा करते हैं। चूंकि कक्षा इस इंटरफ़ेस को लागू करती है, इसलिए आपको mydoc को संभालने की अनुमति है जैसे कि यह उस इंटरफ़ेस का उदाहरण था। यह आपके डॉक्टर-इंटरफेस इस प्रकार दिखाई देगा, तब आप इंटरफ़ेस में सभी घोषित विधियों, जो, वर्ग SimpleDoc

हैं में लागू किया जाता है, उदाहरण के लिए उपयोग करने के लिए अनुमति देता है:

public interface Doc { 
    void print(); 
} 

और अपने SimpleDoc वर्ग लगेगा इस तरह:

public class SimpleDoc implements Doc { 

    public void clear() { ... } 

    @Override 
    public void print() { ... } 

} 

... तो आप केवल print() आप की -method mydoc -object का उपयोग कर सकते हैं। लेकिन आप यह भी कह सकते हैं:

SimpleDoc mydoc = new SimpleDoc(); 

...और फिर आप clear()

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