2010-01-13 9 views
111

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

इस प्रश्न को जोड़ने के लिए: यदि जेनेरिकडिवाइस विभिन्न प्रोजेक्ट में है, तो क्या मैं उस प्रोजेक्ट में IOurDevices इंटरफ़ेस डाल सकता हूं, फिर यदि मैं पहली परियोजना का संदर्भ जोड़ता हूं तो USBDevice क्लास इंटरफ़ेस को कार्यान्वित कर सकता है? क्योंकि सिर्फ एक परियोजना का संदर्भ देना चाहते हैं और फिर डिवाइस के आधार पर विभिन्न इंटरफेस लागू करना चाहते हैं।

class GenericDevice 
{ 
    private string _connectionState; 
    public connectionState 
    { 
     get{return _connectionState; } 
     set{ _connectionState = value;} 
    } 
} 

interface IOurDevices 
{ 
    void connectToDevice(); 
    void DisconnectDevice(); 
    void GetFirmwareVersion(); 
} 

class USBDevice : IOurDevices : GenericDevice 
{ 
    //here I would define the methods in the interface 
    //like this... 
    void connectToDevice() 
    { 
     connectionState = "connected"; 
    } 
} 

//so that in my main program I can do this... 

class myProgram 
{ 
    main() 
    { 
     USBDevice myUSB = new USBDevice(); 
     myUSB.ConnectToDevice; 
    } 
} 
+4

आपके भविष्य के संदर्भ के लिए, सी # विनिर्देश के खंड 10.1.4 में सटीक वर्णन किया गया है कि एक वर्ग को घोषित करने के लिए जिसमें कई आधार प्रकार हैं। –

+0

@ एरिक लिपर्ट: क्या आप कृपया इस मामले के बारे में समझने में मेरी मदद कर सकते हैं कि यह सही तरीका है और भविष्य में उपलब्ध होगा? –

उत्तर

210

हां। प्रयास करें:

class USBDevice : GenericDevice, IOurDevice 

नोट: आधार वर्ग इंटरफ़ेस नामों की सूची से पहले आना चाहिए।

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

+1

यूप यह काम करता है! मैंने इसके बारे में क्यों नहीं सोचा! और नीचे दी गई टिप्पणियों के लिए। उस पर मुझे साफ़ करने के लिए धन्यवाद (कक्षाएं इंटरफेस, कार्यान्वयन इंटरफेस का वारिस नहीं करती हैं) – PICyourBrain

+1

@ जोर्डन, यह भी ध्यान दें कि बेस क्लास और विरासत में इंटरफेस की सूची प्रारंभिक कॉलन (@ मेहदाद के उदाहरण) के बाद कॉमा द्वारा अलग की जाती है। । – JMD

+1

केवल थोड़ी सी विस्तार करने के लिए: यदि आपकी बेस क्लास इंटरफ़ेस लागू करती है तो आपकी व्युत्पन्न कक्षा स्वचालित रूप से उस इंटरफ़ेस को लागू करती है - यहां तक ​​कि 'USBDevice: IOurDevice' के बिना भी। कार्यान्वयन को स्पष्ट रूप से आधार वर्ग को प्रभावित नहीं करता है, लेकिन यह इंटरफ़ेस पर जोर देने में मदद कर सकता है। – STW

18

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

इस तरह की अवधारणाओं पर चर्चा करते समय स्पष्ट शब्दावली महत्वपूर्ण है। जॉन स्कीट के लेखन को चिह्नित करने वाली चीजों में से एक, उदाहरण के लिए, यहां और प्रिंट दोनों में, यह है कि वह हमेशा चीजों को लिखने के तरीके में सटीक होता है।

+8

या एरिक लिपर्ट, जिसका लेखन बहुत सटीक है। – Mathias

16

प्रश्न से संबंधित नहीं (Mehrdad के जवाब तुम जा मिलना चाहिए), और मुझे आशा है कि इस nitpicky के रूप में नहीं लिया जाता है: कक्षाएं नहीं इनहेरिट इंटरफेस, वे उन्हें लागू

.NET एकाधिक विरासत का समर्थन नहीं करता है, इसलिए शर्तों को सीधे संचार में मदद कर सकते हैं। एक वर्ग एक सुपरक्लास से उत्तराधिकारी हो सकता है और जितना चाहें उतने इंटरफेस को कार्यान्वित कर सकता है।


एरिक की टिप्पणी के जवाब में ...

public interface ITwo : IOne 

तकनीकी जवाब है कि ITwo वारिस करता है: मैं के बारे में है या नहीं, इंटरफेस "वारिस" एक और डेवलपर के साथ चर्चा, "लागू" "की आवश्यकता होती है", या की तरह एक घोषणा के साथ इंटरफेस "के साथ लाना" था कुछ कारणों से IOne:

  • इंटरफेस कभी नहीं एक कार्यान्वयन है, इसलिए उनका तर्क है ITwoलागू करता है किIOne fl है गलत
  • ITwo विरासत IOne विधियों, MethodOne()IOne पर मौजूद है तो यह ITwo से भी स्वीकार्य है। i.e: ((ITwo)someObject).MethodOne()) मान्य है, भले ही ITwo स्पष्ट रूप से MethodOne()
  • के लिए परिभाषा नहीं है ... क्योंकि रनटाइम ऐसा कहता है! typeof(IOne).IsAssignableFrom(typeof(ITwo)) रिटर्न true

हम अंत में सहमति इंटरफेस सही/पूर्ण विरासत समर्थन करते हैं। लापता विरासत सुविधाओं (जैसे ओवरराइड, सार/वर्चुअल एक्सेसर्स इत्यादि) इंटरफ़ेस से अनुपलब्ध हैं, इंटरफ़ेस विरासत से नहीं। यह अभी भी अवधारणा को सरल या स्पष्ट नहीं बनाता है, लेकिन यह समझने में मदद करता है कि वास्तव में एरिक की दुनिया में हुड के नीचे क्या चल रहा है :-)

+2

हालांकि, दुर्भाग्यवश, इंटरफ़ेस * अन्य इंटरफेस * प्राप्त करता है। मुझे लगता है कि शब्दों की पसंद दुर्भाग्यपूर्ण है, लेकिन हम अब इसके साथ अटक गए हैं। मैं * इंटरफेस * के रूप में * अन्य इंटरफेस की आवश्यकता के बारे में सोचना पसंद करते हैं।यही है, जब आप कहते हैं "इंटरफ़ेस IFoo: IBar" जिसका अर्थ है "IFoo के कार्यान्वयनकर्ता को इबार को भी लागू करना आवश्यक है"। –

+0

@ एरिक मैं मानता हूं कि यह एक अस्पष्ट शब्द है और इसे थोड़ी देर पहले एक सहयोगी के साथ बहस करता था। अंत में हमने फैसला किया कि "आईटीवो विरासत IOne" कह रहा है। मैं अपने उत्तर को कुछ छोटे कारणों से अपडेट करूंगा (सिर्फ इसलिए कि वे किसी टिप्पणी में स्पष्ट रूप से फिट नहीं होंगे)। – STW

+0

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

1

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

+0

यह सभी मामलों में सार्वजनिक होना आवश्यक नहीं है। बस सुलभ उदाहरण के लिए 'कक्षा में शामिल हैं सभी {निजी इंटरफ़ेस इन्स्टेस्टेड {/ * ... * /} निजी वर्ग MyExample: INested {/ * ... * /}}', 'MyExample' कक्षा एक नेस्टेड निजी इंटरफ़ेस लागू करती है। अन्य उदाहरणों में, नेस्टेड इंटरफेस (और युक्त वर्ग) 'आंतरिक' हो सकता है। यह सब इस बात पर निर्भर करता है कि उन्हें किसका उपयोग करने और उनके साथ परेशान करने की आवश्यकता है। –

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