2012-02-26 18 views
6

संभव डुप्लिकेट:
Interfaces: Why can't I seem to grasp them?
Why would I want to use Interfaces?मुझे इंटरफ़ेस की आवश्यकता क्यों है?

मैं इस सवाल का 1000 बार दोहराया है लगता है और मैं फिर से पूछने के लिए माफी चाहता हूँ। मैं वास्तव में एक सादा सरल उत्तर की तलाश में हूं कि मुझे स्पष्ट रूप से इंटरफ़ेस की आवश्यकता क्यों है, या यदि आप कुछ समझाने के लिए कृपया इंटरफ़ेस के बिना प्राप्त नहीं कर सकते हैं।

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

- पहले से हीएचएक्स।

नोट: मैं नेट (सी #) भाषा के संदर्भ में यह सवाल पूछ रहा हूँ

Edit1: के लिए अब जब भी मैं अपने मन इंटरफ़ेस मुझसे कहता है जानने की कोशिश -> "यार आप करने जा रहे हैं किसी श्वेत शीट में किसी के शरीर की रूपरेखा तैयार करें "लेकिन आपको एक और सफेद शीट की आवश्यकता है जहां आपको फिर से रूपरेखा तैयार करनी होगी, असली शरीर प्राप्त करने के लिए सभी शरीर के अंग रंग भरें।" तो मैं सिर्फ पहली श्वेत पत्रक क्यों बर्बाद कर रहा हूं रूपरेखा

+0

यह मदद कर सकता है: इंटरफेस वर्णन * परिधीय * विशेषताओं, सार कक्षाएं * कोर * कार्यों को परिभाषित करती हैं। – Jason

+0

यदि आप अपनी परियोजना को चाहते हैं तो विभिन्न डेटाबेस का समर्थन करना चाहिए। ताकि ग्राहक भविष्य में अपना डेटाबेस बदल सकें, हम इंटरफेस का उपयोग कक्षा फाइल में संपत्ति प्रक्रियाओं को बदलने के साथ करते हैं ........ –

+0

इस प्रश्न के दर्जनों संभावित डुप्लिकेट हैं ... यहां कुछ हैं: [1 ] (http://stackoverflow.com/questions/240152/why-would-i-want-to-use-interfaces), [2] (http://stackoverflow.com/questions/3355408/explaining-interfaces-to -स्ट्यूडेंट्स), [3] (http://stackoverflow.com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them) –

उत्तर

12
की दुकान

इंटरफेस को समझने का सबसे आसान तरीका यह है कि वे विभिन्न वस्तुओं को COMMON कार्यक्षमता का पर्दाफाश करने की अनुमति देते हैं। यह प्रोग्रामर को एक बहुत ही सरल, छोटा कोड लिखने की अनुमति देता है जो एक इंटरफ़ेस पर प्रोग्राम करता है, तब तक जब तक ऑब्जेक्ट्स उस इंटरफ़ेस को कार्यान्वित करता है, यह काम करेगा।

डाटाबेस प्रदाता:

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

IDbConnection connection = GetDatabaseConnectionFromConfig() 
connection.Open() 
// do stuff 
connection.Close() 

एक इंटरफेस (IDbconnection) अब मैं अपने config में किसी भी डेटा प्रदाता बाहर स्वैप कर सकते हैं करने के लिए प्रोग्रामिंग से देखें, लेकिन मेरे कोड ठीक उसी रहता है। यह लचीलापन बेहद उपयोगी और बनाए रखने में आसान हो सकता है। इसका नकारात्मक पक्ष यह है कि मैं केवल 'जेनेरिक' डेटाबेस ऑपरेशंस कर सकता हूं और प्रत्येक विशेष प्रदाता द्वारा प्रदान की जाने वाली ताकत का पूरी तरह से उपयोग नहीं कर सकता है, क्योंकि प्रोग्रामिंग में सब कुछ आपके पास एक व्यापार बंद है और आपको यह निर्धारित करना होगा कि कौन सा परिदृश्य आपको सबसे ज्यादा लाभ पहुंचाएगा।

संग्रह:

आप लगभग सभी संग्रह इस इंटरफेस IEnumerable कहा जाता है को लागू दिखाई देती है। IENumerable एक IENumerator देता है जिसमें MoveNext(), Current, और रीसेट() है। यह सी # को आपके संग्रह के माध्यम से आसानी से स्थानांतरित करने की अनुमति देता है। ऐसा करने का कारण यह है कि यह आईनेमरेबल इंटरफ़ेस का खुलासा करता है क्योंकि यह पता चलता है कि ऑब्जेक्ट उन तरीकों का खुलासा करता है जिन्हें इसे पार करने की आवश्यकता है। यह दो चीजें करता है। 1) foreach loops अब संग्रह को गणना करने के लिए कैसे पता चलेगा और 2) अब आप अपने संग्रह में शक्तिशाली LINQ exprssions लागू कर सकते हैं। फिर इंटरफेस इतने उपयोगी क्यों हैं क्योंकि सभी संग्रहों में कॉमन में कुछ है, उन्हें स्थानांतरित किया जा सकता है। प्रत्येक संग्रह को एक अलग तरीके से जोड़ा जा सकता है (लिंक्ड लिस्ट बनाम सरणी) लेकिन इंटरफेस की सुंदरता यह है कि कार्यान्वयन इंटरफेस के उपभोक्ता के लिए छुपा और अप्रासंगिक है। MoveNext() आपको संग्रह में अगला आइटम देता है, इससे कोई फर्क नहीं पड़ता कि यह कैसे करता है। बहुत अच्छा, हुह?

बहुरूपता

जब आप अपने स्वयं के इंटरफेस रचना कर रहे हैं आप बस अपने आप को एक सवाल पूछने के लिए है। इन बातों में आम में क्या है? एक बार जब आप ऑब्जेक्ट्स साझा करते हैं, तो आप उन गुणों/तरीकों को एक इंटरफेस में जोड़ देते हैं ताकि प्रत्येक ऑब्जेक्ट इससे प्राप्त हो सके। फिर आप एक इंटरफ़ेस का उपयोग करके कई ऑब्जेक्ट्स के खिलाफ प्रोग्राम कर सकते हैं।

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

var animals = new IAnimal[] = {new Bear(), new Owl(), new Snake()} // here I can collect different objects in a single collection because they inherit from the same interface 

foreach (IAnimal animal in animals) 
{ 
    Console.WriteLine(animal.Name) 
    animal.Speak() // a bear growls, a owl hoots, and a snake hisses 
    animal.Move() // bear runs, owl flys, snake slithers 
} 

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

तो फिर इंटरफेस के साथ सबसे महत्वपूर्ण बात यह है कि ऑब्जेक्ट्स में आम बात है ताकि आप उसी तरह से अलग-अलग वस्तुओं के खिलाफ प्रोग्राम कर सकें। समय बचाता है, कई अन्य लाभों के बीच, अधिक लचीला अनुप्रयोग बनाता है, जटिलता/कार्यान्वयन छुपाता है, असली दुनिया की वस्तुओं/स्थितियों को मॉडल करता है।

उम्मीद है कि इससे मदद मिलती है।

+2

उत्कृष्ट जवाब। –

+0

इंटरफ़ेस का उपयोग करने के पीछे तर्क के सर्वोत्तम स्पष्टीकरणों में से एक। – rajibdotnet

+0

इस उत्तर को बुकमार्क करना। +1। – Jogi

6

एक इंटरफ़ेस अनुबंध कक्षा के लिए क्या कर सकता है, इसका मतलब है कि एक वर्ग कई अनुबंध को पूरा कर सकता है रों।

एक सार वर्ग एक वर्ग है कि कक्षा को कैसे व्यवहार करना चाहिए, आप केवल प्रति वर्ग एक टेम्पलेट भर सकते हैं।

एक विस्तारित कक्षा एक मौजूदा वस्तु लेती है और कार्यक्षमता जोड़ती/बदलती है, आप केवल प्रति वर्ग एक अभिभावक वर्ग का विस्तार कर सकते हैं।

यदि आप वर्णन करना चाहते हैं कि विशिष्ट कार्यान्वयन को परिभाषित किए बिना कुछ कैसे कार्य करना चाहिए, तो आप एक अनुबंध (इंटरफेस) का उपयोग करेंगे। यह अनुबंध किसी भी अन्य वर्ग द्वारा पूरा किया जा सकता है जो परिभाषित विधियों/गुणों को लागू करता है।

यदि आप कार्यक्षमता का हिस्सा आगे बढ़ाना चाहते हैं और फिर उस पर जोड़ना चाहते हैं तो आप एक अमूर्त वर्ग का उपयोग करेंगे।

संपादित करें: इस पर विचार करें:

आप किसी ऐसे ऐप्स जो स्टोर करने के लिए कुछ डेटा कहो EntityA की जरूरत है, लेकिन आप एक से अधिक तरीके हैं जिनसे आप डेटा स्टोर कर सकते हैं हो सकता है (उदाहरण के लिए एक्सएमएल, SQL डेटाबेस, सीएसवी ect)। आप EntityA को स्टोर करने के लिए इन विभिन्न विधियों में से प्रत्येक के लिए एक कक्षा बना सकते हैं। लेकिन जब आप विधि बदलना चाहते थे तो आपको उस प्रकार को स्पष्ट रूप से निर्दिष्ट करना होगा जिसे आप वहां चाहते हैं।

यानी

public class DoStuffWithEntityA{ 
    public void DoStuffAndStoreAsXml(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreAsCsv(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreInDatabase(EntityA entity){ /*Logic*/} 
} 

prehaps यहाँ एक बेहतर तरीका एक अंतरफलक जो सामान्य क्या कुछ है कि संग्रहीत करता EntityA कैसा दिखेगा में वर्णन करता है उपयोग करने के लिए है।

जैसे

public interface IStoreEntityA{ 
    void Store(EnitityA entity); 
} 
तो

तुम सिर्फ कह सकते हैं

public class DoStuffWithEntityA{ 
    private IStoreEntityA _entityAStorer; 
    public DoStuffWithEntityA(IStoreEntityA howIStoreEntityA){ _entityAStorer = howIStoreEntityA;} 
    public void DoStuff(EntityA entity) 
    { 
     //Do Stuff 
     _entityAStorer.Store(entity); 
    } 
} 

इसका मतलब यह है अपने तर्क नहीं है कसकर रास्ता के लिए युग्मित है कि आप कुछ है कि अपने कोड में EntityA संग्रहीत करता चाहते हैं आप EntityA

+0

आपके उत्तर के लिए धन्यवाद। लेकिन अगर आप मेरा नया संपादन पढ़ते हैं तो आप समझेंगे कि मेरे दिमाग में क्या चल रहा है। यदि आप मुझे कुछ उदाहरण देते हैं तो यह सहायक होगा। Thx –

+0

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

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