2009-04-24 15 views
10

सी # में स्पष्ट है, अगर एक वर्ग सब सही तरीकों/एक अंतरफलक के लिए हस्ताक्षर है, लेकिन नहीं है स्पष्ट रूप से यह पसंद को लागू:सी # और इंटरफेस - बनाम अंतर्निहित

class foo : IDoo {} 

कर सकते हैं वर्ग अभी भी उस इंटरफ़ेस के रूप में डाला जा सकता है?

उत्तर

12

नहीं, यह उद्देश्य-सी और कुछ अन्य भाषाओं की तरह नहीं है। आपको स्पष्ट रूप से इंटरफ़ेस कार्यान्वयन घोषित करना चाहिए।

+0

तो अगर मैं इसे इंटरफेस के रूप में डाला तो यह अपवाद फेंक देगा? –

+4

हां, यदि आपकी कक्षा इंटरफ़ेस को लागू नहीं करती है तो आपको अपवाद मिलेगा यदि आप इसे इस तरह डालने का प्रयास करते हैं। –

+1

आप केवल एक ऑब्जेक्ट को ऑब्जेक्ट पर डाल सकते हैं जो कहीं भी अपनी विरासत श्रृंखला में दिखाई देता है (इसमें विरासत श्रृंखला में लागू इंटरफेस शामिल हैं)। – Powerlord

4

बशर्ते कि आईडीू के पास कोई सदस्य हो, यह कोड संकलित नहीं होगा। यदि आईडीू के पास कोई सदस्य नहीं है, तो हाँ, कास्ट सुरक्षित है (लेकिन स्पष्ट रूप से सीमित उपयोग के)।

+0

"स्पष्ट सीमा के बारे में अच्छी बात डी उपयोग "+1 –

+0

ओपी स्पष्ट रूप से निर्दिष्ट करता है * यदि किसी वर्ग में इंटरफेस * के लिए सभी सही तरीके/हस्ताक्षर हैं, लेकिन यदि ऐसा नहीं होता है, तो आपका बिंदु उल्लेखनीय है। ट्रिविया के लिए –

2
public class A 
{ 
    public void DoSomething(); 
} 

public interface IDoSomething 
{ 
    void DoSomething(); 
} 

public class B : A, IDoSomething 
{ } 

बी ए

3

से इनहेरिट द्वारा IDoSomething.DoSomething संतुष्ट यह मूलतः सी #, जो स्वत: ऐसा नहीं होता है में काम करने के लिए बतख टाइपिंग की आवश्यकता होगी।

कुछ libraries हैं जो ऐसा कर सकते हैं।

17

बतख टाइप

क्या आप "duck-typing" (मुहावरा के नाम पर कहा जाता है ओर इशारा करते रहे हैं "अगर यह एक बतख की तरह लग रहा है, और एक बतख की तरह नीम हकीमों, तो यह एक बतख होना चाहिए")।

बतख टाइपिंग के साथ एक इंटरफ़ेस कार्यान्वयन लागू होता है जब आप प्रासंगिक सदस्यों को लागू करते हैं (जैसा कि आप वर्णन करते हैं) हालांकि .NET के पास वर्तमान में इसका कोई व्यापक समर्थन नहीं है।

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

मतलब समय में, आप प्रतिबिंब के माध्यम से बतख टाइपिंग संश्लेषण कर सकते हैं, a library such as this साथ है, जो आप इस तरह एक बतख टाइप कास्ट करने के लिए अनुमति होगी:

दिलचस्प बात यह है IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

कुछ सामान्य ज्ञान, वहां एक छोटी सी जगह है जहां सी # में बतख-टाइपिंग का उपयोग किया जा रहा है - foreach ऑपरेटर। क्रिस्टोफ़ क्वालीना states कि आदेश foreach ऑपरेटर द्वारा गणनीय होने के लिए, एक वर्ग चाहिए: क) एक विधि MoveMext:

एक सार्वजनिक विधि GetEnumerator कि कोई पैरामीटर लेता है और एक प्रकार दो सदस्य हैं कि रिटर्न प्रदान करें जो कोई पैरामीटर नहीं लेता है और एक बूलियन लौटाता है, और बी) एक संपत्ति एक गेटर के साथ वर्तमान जो ऑब्जेक्ट देता है।

ध्यान दें कि वह IEnumerable और न ही IEnumerator का कोई उल्लेख नहीं करता है। यद्यपि एक अंतरनीय वर्ग बनाते समय इन इंटरफेस को कार्यान्वित करना आम बात है, अगर आप इंटरफेस छोड़ना चाहते थे लेकिन कार्यान्वयन छोड़ना चाहते थे, तो आपकी कक्षा अभी भी foreach द्वारा समेकित होगी। देखा! बतख टाइपिंग! (Example code here।)

+0

+1! अच्छा एक –

+0

धन्यवाद। बतख टाइपिंग चीज़ की जांच करने के लिए समय नहीं था और हमेशा इसके बारे में भूल गए। आपने चांदी की प्लेट पर जानकारी दी। –

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