2011-04-14 14 views
11

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

Person person = new PersonImpl(); 

बजाय

PersonImpl person = new PersonImpl(); 

के इंटरफेस कार्यान्वयन छुपा जा करने के लिए माना जाता है का उपयोग कर के लाभ क्या है? क्या यह इंटरफेस का उपयोग करने का सही तरीका है?

public class Driver { 

    public static void main(String [] args) 
    { 
     Person person = new PersonImpl(); 
     person.setName("test name"); 
     System.out.println("Name is "+person.getName()); 
    } 

} 


public interface Person { 

    public void setName(String name); 

    public String getName(); 

} 


public class PersonImpl implements Person{ 

    private String name; 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

हाँ यह अच्छा काम है। –

+1

धन्यवाद लेकिन मुझे लगता है कि मैं इसे पूरी तरह से समझ नहीं पा रहा हूं, शायद मुझे बड़ी तस्वीर नहीं दिखाई दे रही है। क्यों न केवल व्यक्ति - व्यक्ति व्यक्ति = नया व्यक्ति Iplpl(); person.setName ("परीक्षण नाम"); System.out.println ("नाम है" + person.getName()); – user701254

+0

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

उत्तर

10

इंटरफेस का उपयोग करने का यह तरीका है।

कारण यह है कि आप Person का उपयोग करने वाले कोड को बदले बिना बाद में एक और कार्यान्वयन लिख सकते हैं।

तो अब के लिए आप PersonImpl का उपयोग कर सकते हैं लेकिन बाद में आपको OtherTypeOfPersonImpl की आवश्यकता हो सकती है।

आप एक ही इंटरफ़ेस को लागू करने वाली नई कक्षा बना सकते हैं, और आप किसी भी अन्य कोड के साथ नई कक्षा का उपयोग कर सकते हैं जो Person की अपेक्षा करता है।

एक अच्छा उदाहरण List इंटरफ़ेस है।

List जैसे ArrayList, LinkedList, आदि के कई कार्यान्वयन हैं। इनमें से प्रत्येक के पास फायदे और नुकसान हैं। कोड लिखकर List का उपयोग करके, आप प्रत्येक डेवलपर को यह तय करने दे सकते हैं कि किस प्रकार का List उनके लिए सबसे अच्छा काम करता है और बिना किसी बदलाव के उनमें से किसी को संभालने में सक्षम हो सकता है।

+0

इस से थोड़ा उलझन में हूँ। मैं एक और प्रकार का व्यक्ति क्यों बनाना चाहता हूं। ठीक है, मुझे लगता है कि मैं लिखने के रूप में सीख रहा हूँ। ऐसा इसलिए है कि उदाहरण के लिए getName मैं इसे वापस करने से पहले स्ट्रिंग नाम को संशोधित कर सकता हूं या ऐसा कुछ? – user701254

+1

बिल्कुल, आप 2 प्रकार के 'व्यक्ति', 'चाइल्ड' और 'वयस्क' रखना चाहते हैं, जहां 'चाइल्ड' सिर्फ अपना नाम लौटाता है, और 'वयस्क' नाम (श्री व्यक्ति) से पहले शीर्षक के साथ नाम देता है। मैंने अपने जवाब के लिए एक बेहतर उदाहरण जोड़ा कि यह उपयोगी क्यों है। –

4

आपने जो किया वह सही है। Person person = new PersonImpl() का उपयोग करने में लाभ यह है कि इंटरफ़ेस और ठोस कार्यान्वयन के बीच एक ढीला युग्मन बनाए रखा जाता है। PersonImpl person = new PersonImpl() कसकर युग्मित है। और Person person = new Person() संकलित भी नहीं होगा।

कल्पना करें कि आपके पास एक बड़ा आवेदन है, और बहुत से कोड PersonImpl ऑब्जेक्ट पर निर्भर करता है। अब मान लीजिए कि मैं PersonImpl को बदलना चाहता हूं और एक नई कक्षा, PersonImpl2 बनाना चाहता हूं। अब मुझे पूरी परियोजना के माध्यम से मैन्युअल रूप से स्कैन करना होगा और हर जगह बदलाव करना होगा। यह कोड भी तोड़ सकता है। इसे तंग युग्मन कहा जाता है, और यह एक बुरी चीज है। इसके बजाए, यदि शेष कोड किसी व्यक्ति ऑब्जेक्ट पर निर्भर करता है, तो यदि मैं एक नया व्यक्ति Iplpl2 कक्षा बनाता हूं, तो चीजें ठीक काम करेंगी क्योंकि PersonImpl2 व्यक्ति को लागू करता है।

2

एक लाभ मैं सोच सकता हूं कि आपके पास 2 बहुत ही अलग प्रकार के लोग हो सकते हैं, लेकिन आप यह तय करने के लिए रनटाइम (उपयोगकर्ता इनपुट, कॉन्फ़िगरेशन फ़ाइल इत्यादि के आधार पर) तक इंतजार करना चाहते हैं। आप ऐसा कुछ कर सकते हैं:

Person person = null; 
if ... 
    person = new PersonImpl(); 
else 
    person = new PersonImpl2(); 
0

ठोस वर्ग के बजाय इंटरफ़ेस का उपयोग करने से आप बाद में कार्यान्वयन को बदल सकते हैं।

यह जेडीबीसी के बारे में है, यह सब इंटरफेस पर आधारित है, इसलिए ड्राइवर बाद में इसे कार्यान्वित कर सकता है।

उदाहरण के लिए जब आप ResulSet का उपयोग करते हैं तो आपको वास्तव में परवाह नहीं है कि कैसे या क्या अंडरलेइंग कार्यान्वयन है (ओरेकल ड्राइवर के साथ ओरेकल रीसेटल्ट की तरह कुछ होगा, MySQL ड्राइवर MySQLResultSet जैसा कुछ हो सकता है) लेकिन आप जानते हैं कि कौन सी विधियां हैं उपयोग करने के लिए आपके लिए उपलब्ध है।

ही ArrayList या HashMap

2

के बजाय, सूची या मानचित्र के साथ चला जाता यह कैसे आप व्यक्ति का उपयोग करना चाहते पर निर्भर करता है।

जैसा कि यह खड़ा है, आपको इंटरफ़ेस होने से कोई वास्तविक लाभ नहीं मिलता है।

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

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