2010-11-12 16 views
27

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

+8

खोज बॉक्स में "इंटरफ़ेस" प्लग करें। एसओ पर पहले से ही कुछ उत्कृष्ट प्रश्न/उत्तर धागे हैं। उदाहरण के लिए: http://stackoverflow.com/questions/444245/how-will-i-now-when-to-create-an-interface –

+2

इंटरफ़ेस पर दर्जनों प्रश्न हैं, जिनमें से कुछ "वे क्या हैं और उन्हें क्यों/कैसे उपयोग करें "प्रश्न। इसके अलावा, Google। (संपादित करें: अब -1। मुझे जरूरी नहीं है, लेकिन यह प्रश्न अप्सोट्स के लायक नहीं है या तो ims) – delnan

उत्तर

46
interface IFlyable 
{ 
    void Fly(); 
} 

class Bird : IFlyable 
{ 
    public void Fly() { } 
} 

class Plane : IFlyable 
{ 
    public void Fly() { } 
} 

List<IFlyable> things = GetBirdInstancesAndPlaneInstancesMixed(); 
foreach(IFlyable item in things) 
{ 
    item.Fly(); 
} 

Bird और PlaneObject को छोड़कर कोई आम आधार वर्ग है, लेकिन आप एक ही इंटरफ़ेस हम हमारे कार्यक्रम में grouply उनसे निपटने के कर सकते हैं का उपयोग कर देख सकते हैं, क्योंकि वे एक ही "सुविधा" है: फ्लाई।

+1

बहुत बहुत धन्यवाद यह मुझे सबसे ज्यादा समझ में आता है –

+0

यदि आप सही हैं तो 'अंतर IFlyable'? इंटरफ़ेस की क्या आवश्यकता है? –

+1

@AmirZojaji क्योंकि 'प्लेन' में पहले से ही 'मशीन' जैसी बेस क्लास है, और 'बर्ड' की मूल श्रेणी 'पशु' है। आधार वर्गों के विपरीत इंटरफेस संयुक्त होना आसान है। –

8

Interfaces किसी भी प्रकार की श्रेणी परिभाषा समान है, interface और इसे कार्यान्वित करने वाले वर्ग के बीच अनुबंध का एक प्रकार है।

एक इंटरफ़ेस में केवल विधियों, गुणों, घटनाओं या अनुक्रमणिका के हस्ताक्षर होते हैं। इंटरफ़ेस को लागू करने वाली कक्षा या संरचना को इंटरफ़ेस परिभाषा में निर्दिष्ट इंटरफ़ेस के सदस्यों को लागू करना होगा।

एक .NET कक्षा बहु-विरासत का उपयोग नहीं कर सकती है। इस प्रकार, हम इंटरफेस पर भरोसा करते हैं, और एक वर्ग जितना चाहें उतना इंटरफेस लागू कर सकता है। इसके विपरीत, एक वर्ग विरासत एकल होना चाहिए। उदाहरण के लिए:

public class Customer : Person, Company { 
} 

इस कोड को किसी भी .NET भाषाओं में अनुमति नहीं है जो मुझे पता है (सी #/वीबी.नेट)।

इस कमी का सामना करने के लिए, यदि हम ऐसा कह सकते हैं, तो हम इंटरफेस पर भरोसा करते हैं।

public interface IPerson { 
    string Name 
    string Address 
    string StateProvince 
    string ZipPostalCode 
    string Country 
    long PhoneNumber 
} 

public interface ICompany { 
    string CreditTerm 
    string BillingAddress 
    string ShippingAddress 
    string ContactName 
    long ContactPhoneNumber 
    long FaxNumber 
} 

public class Customer : IPerson, ICompany { 
    // Properties implementations here. 
} 

इस तरह, इंटरफेस किसी भी तरह से बहु-विरासत के लिए कामकाज की तरह हैं।

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

public BillCompany(ICompany company) { 
    // Bill company here... 
} 

फिर, अपने Customer वर्ग, आप क्या उम्मीद कर रहे हैं के अनुरूप के बाद से यह ICompany इंटरफ़ेस लागू करता है।

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

public class Individual : IPerson { 
    // Interface implementation here... 
} 

फिर, अपने BillCompany() विधि Individual वर्ग का एक उदाहरण स्वीकार नहीं कर सकता, क्योंकि यह एक कंपनी के लिए आवश्यकताओं (गुण, आदि) नहीं दिखाता है।

संक्षेप में, इंटरफेस अनुबंध द्वारा बाध्य करने का एक अच्छा तरीका है जो आपके तरीके को स्वीकार किया जाएगा, जैसे विरासत।

Interface एस के साथ काम करते समय वास्तव में कुछ सावधानी बरतनी है, एक इंटरफेस में बदलाव आपके कोड को तोड़ देगा, सभी लागू वर्गों के भीतर नए सदस्य को लागू करने के लिए एक लागू नियम के रूप में, जो वर्ग विरासत नहीं करता है।

क्या इससे मदद मिलती है?

+0

[msdn] (https://msdn.microsoft.com/en-us/library/ms173156 पर आधारित है। एएसपीएक्स) एक इंटरफ़ेस में ** स्थिरांक **, ** फ़ील्ड **, ** ऑपरेटर **, ** इंस्टेंस कन्स्ट्रक्टर **, ** विनाशक **, या ** प्रकार ** शामिल नहीं हो सकते हैं। कृपया अपना उत्तर – ako

4

मैं इस ब्लॉग पोस्ट है कि मैं दूसरे दिन पढ़ चाहते: http://simpleprogrammer.com/2010/11/02/back-to-basics-what-is-an-interface/

बहुत से लोग अपने आप को शामिल, बनाया है इंटरफेस वर्ग वे प्रतिनिधित्व कर रहे हैं करने के लिए एक 1 1 के लिए मानचित्रण है लेकिन यह हमेशा एक अच्छा नहीं है चीज और वह लेख बताता है क्यों।

+1

ग्रेट आलेख संपादित करें! उस लिंक पर पोस्टिंग के लिए धन्यवाद। –

+0

@aaaaaaaaaaaaaaaaaaa फिर आपने इसे क्यों चिह्नित नहीं किया>? –

+0

@girl: क्योंकि मैं वोट नहीं दे सकता। मैं एक पंजीकृत उपयोगकर्ता होने से इनकार करता हूं। –

0

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

this page पर, इंटरफेस कैसा दिखता है, एक वर्ग को इंटरफ़ेस से कैसे प्राप्त किया जाता है और एक कार्यान्वित करने का एक पूर्ण उदाहरण उदाहरण के कई उदाहरण हैं इंटरफ़ेस।

आशा यह कुछ बाहर में मदद करता है।

26
public interface ISpeaks 
{ 
    string Speak(); 
} 

public class Dog : Mammal, ISpeaks 
{ 
    public string Speak() { return "Woof!"; } 
} 

public class Person : Mammal, ISpeaks 
{ 
    public string Speak() { return "Hi!"; } 
} 

//Notice Telephone has a different abstract class 
public class Telephone : Appliance, ISpeaks 
{ 
    public Telephone(Person p) 
    { 
     Person = p; 
    } 
    public Person { get; set; } 
    public string Speak() { p.Speak(); } 
} 


[Test] 
public void Test_Objects_Can_Speak() 
{ 
    List<ISpeaks> thingsThatCanSpeak = new List<ISpeaks>(); 
    //We can add anything that implements the interface to the list 
    thingsThatCanSpeak.Add(new Dog()); 
    thingsThatCanSpeak.Add(new Person()); 
    thingsThatCanSpeak.Add(new Telephone(new Person())); 

    foreach(var thing in thingsThatCanSpeak) 
    { 
     //We know at compile time that everything in the collection can speak 
     Console.WriteLine(thing.Speak()); 
    } 
} 

यह उपयोगी है क्योंकि हम नहीं बल्कि कार्यान्वयन से इंटरफेस के खिलाफ कोड कर सकते हैं और क्योंकि हम एक एकल वर्ग पर कई इंटरफेस का उपयोग कर सकते हैं, तो हम अगर तुलना में अधिक लचीला कर रहे हैं हमने एक सार कक्षा का उपयोग किया।

+0

अपनी 'चीजें टाटाकैन स्पीक। जोड़ें (नया टेलीफोन());' काम नहीं करेगा क्योंकि टेलीफोन को कन्स्ट्रक्टर में एक व्यक्ति की आवश्यकता होती है;) – Nate

+0

+1 को अमूर्त बिट दिखाने के लिए, इंटरफेस कुछ विरासत कक्षाओं को परिभाषित करना चाहिए, न कि विरासत कक्षाओं को हो। –

+0

@Nate इसके लिए धन्यवाद, बाद में इसे अमूर्त वर्ग अंतर को चित्रित करने के लिए जोड़ा गया। –

4

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

तो मान लीजिए कि आपके पास एक तरीका है जो बचत अनुरोधों को संसाधित करना है। यह सहेजने का वास्तविक कार्य नहीं करता है, यह सिर्फ अनुरोधों को संसाधित करता है। नतीजतन, यह List<ICanSave> ले सकता है, जहां ICanSave एक इंटरफ़ेस है। उस सूची में ऑब्जेक्ट्स किसी भी प्रकार का हो सकता है जो उस इंटरफ़ेस को लागू करता है। यह एक मिश्रण हो सकता है, या इसमें केवल एक प्रकार हो सकता है। आप बस चिंतित हैं कि यह इंटरफ़ेस लागू करता है।

public interface ICanSave 
{ 
    void Save(); 
} 

अपने विधि में, आप उन वस्तुओं सहेजा जा रहा है कैसे

public void SaveItems(List<ICanSave> items) 
{ 
    foreach (var item in items) 
    { 
     item.Save(); 
    } 
} 

की तरह कुछ सरल हो सकता है? आपको परवाह नहीं है! वह, फिर से, इंटरफेस को लागू करने वाले वर्ग के लिए एक कार्यान्वयन विस्तार है। आप बस उस वर्ग को चाहते हैं जो उस क्षमता के लिए विधि में प्रवेश करता है।

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

यह केवल एक उपयोग-केस परिदृश्य है, बीसीएल में कई अन्य हैं। IEnumerable<T> एक अच्छा है, इसे ICollection<T> और IList<T> जैसी चीजों द्वारा कार्यान्वित किया जाता है, जो बदले में Array और List<T> जैसे ठोस प्रकारों द्वारा लागू किए जाते हैं। यह इंटरफ़ेस है जो कई प्रोग्रामिंग संरचनाओं को बनाता है जो आप उपयोगी के आदी हो सकते हैं, जैसे LINQ। LINQ कक्षा के वास्तविक कार्यान्वयन * की परवाह नहीं करता है, यह सिर्फ इसे गणना करने और उचित फ़िल्टरिंग और/या प्रक्षेपण करने में सक्षम होना चाहता है।

IDisposable एक और अच्छा बीसीएल उदाहरण है। आप जानना चाहते हैं कि एक वर्ग को खुद के बाद साफ करने की जरूरत है। इसे विशेष रूप से साफ करने की आवश्यकता है जिसे कक्षा में छोड़ दिया गया है, लेकिन IDisposable को कार्यान्वित करने की प्रकृति से, आप जानते हैं कि को अपने आप को साफ करने के लिए की आवश्यकता है, इसलिए आप इसके उपयोग को using कथन में प्राथमिक रूप से लपेटें या आप मैन्युअल रूप से सुनिश्चित करें कि आप एक बार जब आप ऑब्जेक्ट के साथ काम करना समाप्त कर लेंगे तो .Dispose पर कॉल करें।

* LINQ वास्तव में कुछ इंटरफेस के लिए अनुकूलित करता है।

1

"मुझे कक्षाओं का एक गुच्छा मिला है कि मैं एक निश्चित तरीके से कार्य करना चाहता हूं।"

तो, आप एक अनुबंध लिखते हैं।

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

3

वर्ग जानवर के दो कार्यान्वयन के साथ इंटरफेस पशु की सरल उदाहरण (आप पशु और वर्ग कुत्ते कई कार्यान्वयन, बिल्ली के लिए एक अनूठा वर्णन है ...)

public interface IAnimal 
{ 
    string GetDescription(); 
} 

class Cat : IAnimal 
{  
    public string GetDescription() 
    { 
     return "I'm a cat"; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Cat myCat = new Cat(); 

     Console.WriteLine(myCat.GetDescription()); 
    } 
} 
+0

यहां तक ​​कि मैं यहां से समझ सकता हूं :) –

1

यहां इंटरफ़ेस के मुख्य अंक है,

1. हम अलग-अलग वर्गों का उपयोग करके एक ही विधि को अलग-अलग तरीकों से अलग कर सकते हैं।

सरल उदाहरण:

class Mango : abc 
{ 
    public static void Main() 
    { 
     System.Console.WriteLine("Hello Interfaces"); 
     Mango refDemo = new Mango(); 
     refDemo.mymethod(); 
     Orange refSample = new Orange(); 
     refSample.mymethod(); 

    } 

    public void mymethod() 
    { 
     System.Console.WriteLine("In Mango : mymethod"); 
    } 
} 

interface abc 
{ 
    void mymethod(); 
} 

class Orange : abc 
{ 
    public void mymethod() 
    { 
     System.Console.WriteLine("In Orange : mymethod"); 
    } 
} 

2.can विभिन्न वर्गों के साथ एक ही इंटरफ़ेस का उपयोग कर कॉल एक ही विधि।

class Mango : abc 
{ 
    public static void Main() 
    { 
     System.Console.WriteLine("Hello Interfaces"); 
     abc refabc = new Mango(); 
     refabc.mymethod(); 
     abc refabd = new Orange(); 
     refabd.mymethod(); 
     Console.ReadLine(); 
    } 

    public void mymethod() 
    { 
     System.Console.WriteLine("In Mango : mymethod"); 
    } 
} 

interface abc 
{ 
    void mymethod(); 
} 

class Orange : abc 
{ 
    public void mymethod() 
    { 
     System.Console.WriteLine("In Orange : mymethod"); 
    } 
} 
+0

क्या आप दो उदाहरणों के बीच अंतर देख सकते हैं? –

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