हम इंटरफ़ेस का उपयोग क्यों करते हैं? क्या यह केवल मानकीकरण के लिए है? [बन्द है]


79

हम इंटरफ़ेस का उपयोग क्यों करते हैं?

क्या यह केवल मानकीकरण के लिए है?


1
विरोध के रूप में...? इंटरफेस के कई उपयोग हैं ...
जेसन

6
मैं वास्तव में चाहता हूं कि लोग उन पोस्टों पर c # जैसे टैग न लगाएं जो c # विशिष्ट नहीं हैं। यह एक बहुत अच्छा सवाल है, और मैं इसे याद कर सकता हूँ क्योंकि c # एक अनदेखा टैग है।
टायलर कार्टर

जवाबों:


171

इंटरफेस का उद्देश्य

  • शिथिल युग्मित सॉफ़्टवेयर बनाएँ
  • अनुबंध द्वारा समर्थन डिजाइन (एक कार्यान्वयनकर्ता को संपूर्ण इंटरफ़ेस प्रदान करना होगा)
  • प्लग करने योग्य सॉफ़्टवेयर के लिए अनुमति दें
  • विभिन्न वस्तुओं को आसानी से बातचीत करने की अनुमति दें
  • एक दूसरे से कक्षाओं का कार्यान्वयन विवरण छिपाएं
  • सॉफ्टवेयर के पुन: उपयोग की सुविधा

सादृश्य 1 : अमेरिकी अंतरिक्ष यान, रूसी सोयुज अंतरिक्ष यान और चीनी शेनझो 5 की तरह बहुत कुछ अंतर्राष्ट्रीय अंतरिक्ष स्टेशन को डॉक कर सकता है, क्योंकि वे एक ही डॉकिंग इंटरफ़ेस को लागू करते हैं। (यह सिर्फ एक उदाहरण है - मुझे नहीं पता कि यह वास्तविक जीवन में सच है लेकिन चलो एक उदाहरण के लिए हमारे अविश्वास को निलंबित कर दें)

सादृश्य 2 : जैसे आप अपने होम कंप्यूटर में विभिन्न कंप्यूटर मॉनिटर प्लग कर सकते हैं। आप इसमें एक दीवार के आकार का टीवी प्लग कर सकते हैं, एक पुराना CRT (मोटी तरह का), एक 20 "फ्लैट स्क्रीन, या एक ब्रेल मशीन जो अंधे को" टच "करके देख सकता है। इन विभिन्न / विभिन्न उपकरणों और आपके बीच संगतता है। कंप्यूटर क्योंकि वे सभी इंटरफ़ेस मानकों पर सहमत हैं।

C # इंटरफेस का विवरण - C # / OOP इंटरफेस के साथ आप एक ही तरह का काम कर रहे हैं लेकिन अनदेखी / आभासी दुनिया में।

आप के बारे में सही कर रहे हैं मानकीकरण , लेकिन यह भी लचीलापन , scalability , तानाना , रख-रखाव , पुनर्प्रयोग , testability और बिजली

(जितना अधिक आप सॉफ्टवेयर का उपयोग करते हैं उतना अधिक इन "बज़ शब्द" को समझा जाएगा। और हमेशा वास्तविक दुनिया में इंटरफेस पर विचार करें क्योंकि उन्होंने हमें समान रूप से अच्छा किया है।)


18
आपने इंटरफेस का मेरा पसंदीदा उपयोग छोड़ दिया: परीक्षणशीलता। अगर मेरे पास दो कक्षाएं हैं, तो ए और बी, और ए.फू। बी.बार कहते हैं, जब तक बी एक इंटरफ़ेस लागू करता है और ए में "इंजेक्ट" किया जा सकता है, तो मैं इसके बजाय नकली, नकली या ठूंठ वर्ग का उपयोग कर सकता हूं वास्तविक बी। यह विशेष रूप से तब उपयोगी होता है जब ए। बीबर से वापसी मूल्य के आधार पर अपना व्यवहार बदलता है। (कहते हैं कि बी.बर एक बूल लौटाता है। एफ़ू में एक और क्लॉज़ के साथ एक (बी.बी.आर.) बयान हो सकता है।) बी में एक इंटरफेस का उपयोग करके मुझे नकली, नकली और / या स्टब बनाने की अनुमति मिलती है जो मुझे परीक्षण करने की अनुमति देता है। तब होता है जब बीबर सच्चा या झूठा लौटता है।
आर्दलेओवर

@Alan आर -टेस्टेबिलिटी जोड़ी गई। धन्यवाद।
जॉन के

1
स्वीकृत जवाब TOP सामान है और यह अवधारणा को देखने के लिए ताज़ा नहीं है क्योंकि अधिकांश रूपरेखा डिज़ाइन दिशानिर्देश सामग्री इसे समझाने या समझने में विफल है। बस यह जोड़ना कि यदि आप जेनरिक का गंभीरता से उपयोग कर रहे हैं, तो मुझे नहीं पता कि आप उनके बिना कैसे गए।
राम-जका टोटी

6
+1standardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
रवि 10

29

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

उदाहरण के लिए:

public interface IMyInterface{
    public void DoFirst();
    public int DoSecond();
}


public class A : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blubb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blubb2");
     return 2;  
   }
}

public class B : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blibb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blibb2");  
     return 4;
   }
}

कक्षाएं इंटरफ़ेस को कई तरीकों से लागू करती हैं। लेकिन आप उन्हें IMyInterface के रूप में उपयोग कर सकते हैं। उदाहरण के लिए:

public static void DoMethodsInInterface(IMyInterface inter){
    inter.DoFirst();
    inter.DoSecond();
}


public static void main(){

   DoMethodsInInterface(new A());
   DoMethodsInInterface(new B());
   //Or use it in a List
   List<IMyInterface> interlist = new List<IMyInterface>();
   interlist.Add(new A());
   interlist.Add(new B());
   foreach(IMyInterface inter in interlist){
      inter.DoFirst();
   }

}

मुझे उम्मीद है कि यह थोड़ा स्पष्ट है कि इंटरफेस क्यों उपयोगी हैं।


2
यह प्रश्न एक ऐसे प्रश्न से जुड़ा हुआ था जो पूछता है कि केवल उचित कार्य करने वाले सदस्यों आदि के बजाय इंटरफेस का उपयोग क्यों करें, और आपका उत्तर उस एक का उत्तर देने के सबसे करीब आता है। यदि दो असंबंधित कक्षाएं दोनों में एक विधि है Woozle, तो कोई भी कोड जो किसी भी वर्ग के संदर्भ को स्वीकार करना चाहता है और Woozleउसे यह जानना होगा कि वह किस वर्ग के साथ काम कर रहा है, और केवल उन Woozleकक्षाओं के लिए सक्षम होगा जिनके बारे में वह जानता था। इसके विपरीत, यदि दोनों वर्ग लागू होते हैं IWoozler, तो कोड जो किसी IWoozlerको भी दिया जाता है, Woozleवह उसके सटीक प्रकार को जाने बिना कर सकता है।
सुपरकैट

यह उत्तर मैंने देखा है की तुलना में बेहतर नाखून। यह सब एक वस्तु क्या कर सकता है के बारे में है। इंटरफेस उन ऑब्जेक्ट्स से संबंधित कार्यों का एक सेट निर्दिष्ट करते हैं जो उन कार्यों के भीतर होता है जो स्पष्ट रूप से ऑब्जेक्ट विशिष्ट होंगे।
m12lrpv

5

यह इंटरफेसिंग के लिए है :), ताकि आप सामान के बीच इंटरफेस कर सकें, जब आपके पास यह उपयोगी हो

  • एक ही सामान के कई कार्यान्वयन
  • जब आप कई अलग-अलग वर्गों के लिए एक इंटरफ़ेस लागू करते हैं क्योंकि आपको कुछ प्रकार के सम्मेलन की आवश्यकता होती है जो इन वर्गों के लिए कुछ सामान करने में सक्षम हैं या उनकी कार्यक्षमता है

3

यहां देखें उच्च स्तरीय दृश्य ...

सूचना छिपाने की अवधारणा में इंटरफेस एक बड़ी भूमिका निभाते हैं ।

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

जब मैंने पहली बार इंटरफेस को समझना शुरू किया, तो उन्हें "अनुबंध के रूप में समझाया गया जो आपके वर्ग का विवरण प्रदान करता है।" यकीन नहीं है कि अगर यह आपकी मदद करेगा लेकिन अगर आप एक कार के लिए एक इंटरफ़ेस के बारे में सोचते हैं तो आप कह सकते हैं कि यह ड्राइव , ब्रेक , और मुड़ता है । इसलिए जब तक यह मुझे बिंदु A से बिंदु B तक ले जाता है, मुझे वास्तव में यह जानने की जरूरत नहीं है कि उन कार्यों को कैसे कार्यान्वित किया जाता है।


2

C # / Java जैसी भाषाओं में इंटरफेस का उपयोग मुख्य कारण है क्योंकि वे भाषाएँ एकाधिक (वर्ग) वंशानुक्रम का समर्थन नहीं करती हैं (देखें कि बहु विरासत के साथ सटीक समस्या क्या है? )।

लेकिन कई (इंटरफ़ेस) कार्यान्वयन को अलग-अलग तरीकों से उपयोग करने की अनुमति दी जाती है।


1
प्रबंधित भाषाओं में इंटरफ़ेस एकाधिक वंशानुक्रम के लिए प्रतिस्थापन नहीं हैं। और, कई भाषाओं में भी, जो कई विरासतों का समर्थन करते हैं, एक इंटरफ़ेस संस कार्यान्वयन की अवधारणा को भरोसेमंद और उपयोगी है। (निर्भरता इंजेक्शन देखें।)
aridlehoover

1
-1 बहुत अच्छी तरह से सोचा-समझा नहीं, या क्या आप वास्तव में सी # या जावा को नहीं समझते हैं?
जॉन सॉन्डर्स

मैं केवल इतना कहना चाहता हूं कि सी ++ में शुद्ध अमूर्त वर्गों का उपयोग इंटरफेस के बजाय किया जा सकता है। अधिकांश चीजें जो आप जावा / सी # में कर सकते हैं इंटरफेस के साथ आप शुद्ध अमूर्त कक्षाओं के साथ सी ++ में कर सकते हैं। C ++ में यदि आप एक वर्ग चाहते थे कि आपके पास एक से अधिक व्यवहार हों, तो आप कई शुद्ध अमूर्त वर्ग प्राप्त करेंगे। लेकिन आप ऐसा जावा / सी # में नहीं कर सकते। मैं यह नहीं कह रहा हूं कि इंटरफेस "उपयोगी" नहीं हैं, मैं इससे अधिक कह रहा हूं: जावा और सी # जैसी भाषाएं कई इंटरफ़ेस वंशानुक्रम के बिना वास्तव में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा नहीं होंगी। (वे कई वर्ग वंशानुक्रम और न ही मिश्रण की अनुमति नहीं देते हैं)
कैटलिन DICU

1
+1 यह अनिवार्य रूप से है जिसे C # और Java के अनुभव से कठिन तरीके से खोजा गया है। यदि आप कई विरासत से बचकर सरल बनाने की कोशिश करते हैं, तो आप कहीं और जटिलता पैदा करते हैं। एक एकीकृत अंतर्निहित दृष्टिकोण की कमी के कारण, आप बदतर जटिलता के साथ समाप्त होते हैं। क्रेज़िस्टॉफ़ सेलविना का सी # प्रोग्रामिंग भाषा 3 डी संस्करण , 1.9 इंटरफेसेस में एनोटेशन देखें , जो बिल्कुल यही कहता है। अब तक, सी # और जावा में अभी भी अनसुलझी समस्याएं हैं जो कि वर्गों के कई वंशानुक्रम की अनुमति होने पर सरल समाधान होंगे।
डैनियल ईयरविकर

-1 विरासत और इंटरफेस वास्तव में बहुत अलग हैं।
केनी

2

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


1

सोचो दूरस्थ बनाने ...

यहां एक क्लाइंट और एक सर्वर शामिल है। आइए कहते हैं कि वे इंटरनेट द्वारा शारीरिक रूप से अलग हो गए हैं। क्लाइंट एक ऐसी विधि कह रहा है जिसका वास्तविक निष्पादन सर्वर पर होता है। क्लाइंट के दृष्टिकोण से क्लाइंट को सर्वर में ऑब्जेक्ट के बारे में कुछ भी नहीं पता है जो निष्पादन करता है। हालांकि यह पता है कि किस विधि से कॉल करना है। क्योंकि क्लाइंट प्रोग्राम बनाते समय, हम केवल एक इंटरफ़ेस (या अनुबंध) के संपर्क में होते हैं। हम पूरी वस्तु के संपर्क में नहीं हैं जो वास्तव में सर्वर पर रह रही है। .Net रीमोटिंग में कुछ डेमो ऐप्स करने की कोशिश करें, और आप बाकी का पता लगा लेंगे। खुश प्रोग्रामिंग।


0

हम इंटरफेस का उपयोग क्यों करते हैं?

कुछ भाषाएं vtables का उपयोग करके पॉलीमोर्फिक विधि कॉल को लागू करती हैं और अधिकांश प्रकार की सूचनाओं को छोड़ देती हैं, जिससे यह कठिन नहीं होता है इंटरफेस को परिभाषित करना जाता है।

इसलिए कभी-कभी हम केवल इंटरफेस का उपयोग करते हैं क्योंकि भाषा के डिजाइन की आवश्यकता होती है।


0

एक इंटरफेस के साथ शुरू करके, आप एक प्रॉक्सी को लागू कर सकते हैं , इस प्रकार एक ठोस कार्यान्वयन के तरीकों को कॉल करते समय आलसी लोडिंग या कुछ सत्यापन करने की अनुमति देते हैं।


0

इंटरफ़ेस कार्यान्वयन तर्क से डेटा प्रकार को अलग करता है।


0

इंटरफ़ेस प्रोटोटाइप मोडल प्रदान करता है जिसमें सिर्फ एक विशिष्ट व्यवहार की कार्यक्षमता की घोषणा शामिल है।

और यदि आप इस व्यवहार को कक्षा में लागू करना चाहते हैं तो यू को इस इंटरफ़ेस को कक्षा में लागू करना होगा तब कक्षा में यह व्यवहार कार्यक्षमता होती है या इसमें कई व्यवहार हो सकते हैं।

क्योंकि वर्ग कई इंटरफ़ेस को लागू कर सकता है।


0

अगर कोई और मेरे जैसा है और उदाहरण और समझ से सीखता है, तो केवल स्पष्टीकरण के बजाय, यहाँ कुछ कोड है ...।

मुझे C # में एक न्यूरल नेटवर्क का यह कार्यान्वयन मिला, जिसमें प्रोजेक्ट डाउनलोड भी शामिल है, जो एक सुंदर और उपयोगी तरीके से इंटरफेस का उपयोग करता है:

http://www.c-sharpcorner.com/UploadFile/rmcochran/AI_OOP_NeuralNet06192006090112AM/AI_OOP_NeuralNet.aspx

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.