एक इंटरफेस का कहना है कि कैसे कुछ काम करना चाहिए। इसे अनुबंध या टेम्पलेट के रूप में सोचें। यह इनवर्सन ऑफ कंट्रोल या निर्भरता इंजेक्शन जैसी चीजों की कुंजी है।
मैं अपने आईओसी कंटेनर के रूप में संरचना मानचित्र का उपयोग करता हूं। यह मुझे मेरी सभी कक्षाओं के लिए एक इंटरफ़ेस परिभाषित करने की अनुमति देता है। आप कहाँ कह सकते हैं
Widget w = new Widget();
मैं कहूंगा कि
IWidget w = ObjectFactory.GetInstance<IWidget>();
इस में है कि मेरे कोड जरूरी क्या एक विजेट वास्तव में है नहीं कह रहा है बहुत शक्तिशाली है। यह सिर्फ जानता है कि IWidget के इंटरफेस के आधार पर एक विजेट क्या कर सकता है।
इसमें इसके लिए कुछ बड़ी शक्ति है कि अब मैं एक आईओसी कंटेनर का उपयोग कर रहा हूं, मैं कुछ और निफ्टी चीजें कर सकता हूं। मेरे यूनिट परीक्षणों में जहां मुझे विजेट का उपयोग करने की आवश्यकता है, मैं विजेट के लिए एक नकली बना सकता हूं। तो कहें कि मेरा विजेट किसी डेटाबेस या वेब सेवा से कनेक्ट करने के तरीके से बहुत शक्तिशाली है, मेरा मॉक इन संसाधनों से जुड़ने का अनुकरण कर सकता है और मुझे डेटा पर वापस लौटा सकता है। इससे मेरा परीक्षण तेजी से चलता है और इस तरह से व्यवहार करता है जो अधिक विश्वसनीय है। क्योंकि मैं स्ट्रक्चर मैप का उपयोग कर रहा हूं, मैं अपने कोड के उत्पादन के उपयोग के दौरान अपने विजेट के वास्तविक कार्यान्वयन को लोड करने के लिए स्ट्रक्चर मैप बता सकता हूं और प्रोग्राम के या या कॉन्फ़िगरेशन के दौरान विजेट के मॉक किए गए संस्करण को लोड कर सकता हूं।
इसके अलावा, क्योंकि मैं एक आईओसी कंटेनर का उपयोग कर रहा हूं, मैं अपने आवेदन में ठंडा नई सुविधाएं प्रदान कर सकता हूं जैसे कि डेटा कैश करने के तीन अलग-अलग तरीकों को लिखना। मेरे पास स्थानीय कैश के लिए Lucene.NET जैसे टूल का उपयोग करके स्थानीय डेवलपर बॉक्स कैश हो सकता है। मेरे पास एक विकास सर्वर .NET कैश का उपयोग कर सकता है जो एक बॉक्स पर बहुत अच्छा चलता है। और फिर मेरे उत्पादन सर्वर के लिए एक तीसरा विकल्प हो सकता है जैसे कि कैश परत जैसे MemCache Win32 या Velocity। जब तक सभी तीन कैशिंग कार्यान्वयन एक ही इंटरफ़ेस के अनुरूप होते हैं, उनके वास्तविक कार्यान्वयन से मुझे (या मेरा कोड) बिल्कुल चिंता नहीं होती है। मैं बस मौजूदा वातावरण कार्यान्वयन पाने के लिए स्ट्रक्चर मैप से पूछता हूं और फिर काम पर जाता हूं।
यदि आप सभी पर निर्भरता इंजेक्शन का पालन करते हैं तो इंटरफ़ेस यहां आईओसी कंटेनर जैसे स्ट्रक्चर मैप के साथ काम में आते हैं जिसमें मैं अपनी कक्षा के निर्माता में इंटरफ़ेस के माध्यम से कक्षा का उपयोग घोषित कर सकता हूं।
public class Widget(IWidgetRepository repository, IWidgetService service) : IWidget
{
//do something here using my repository and service
}
और फिर जब मैं StructureMap के माध्यम से विजेट का एक उदाहरण नए तरह के इस
IWidget widget = ObjectFactory.GetInstance<IWidget>();
सूचना है कि मैं निर्माता में भंडार या सेवा को निर्दिष्ट नहीं कर रहा हूँ के रूप में। संरचना मैप कन्स्ट्रक्टर में निर्दिष्ट इंटरफेस के माध्यम से जानता है कि उपयुक्त उदाहरण कैसे प्राप्त करें और उन्हें भी पास करें। यह बहुत शक्तिशाली और साफ कोड बनाता है!
इंटरफेस की सरल परिभाषा और उनमें से कुछ चालाक उपयोग से!
यहां देखें http://stackoverflow.com/questions/56867/interface-vs-base-class और यहां http://stackoverflow.com/questions/444245/how-will-i-now-when-to- अधिक के लिए बनाएँ-एक-इंटरफ़ेस और "सी # इंटरफ़ेस" की खोज। – Marc