2008-11-01 20 views
7

आज किसी ने मुझे बताया कि सी # में इंटरफ़ेस कार्यान्वयन सिर्फ "कैन-डू" संबंध है, न कि "Is-A" रिश्ते। यह मेरे लंबे समय से एलएसपी (लिस्कोव प्रतिस्थापन सिद्धांत) में विश्वास के साथ संघर्ष करता है। मैं हमेशा सोचता हूं कि सभी विरासत का मतलब "आइस-ए" संबंध होना चाहिए।सी # इंटरफेस कार्यान्वयन संबंध सिर्फ "कर सकते हैं" संबंध है?

तो, यदि इंटरफ़ेस कार्यान्वयन केवल "कैन-डू" संबंध है। क्या होगा यदि कोई इंटरफ़ेस "IHuman" और "IEngineer" है, और एक वर्ग "प्रोग्रामर" "IHuman" & "IEngineer" से विरासत में मिलता है? निश्चित रूप से, एक "प्रोग्रामर" एक "IHuman" और ए "IEngineer" है।

यदि यह सिर्फ "कैन-डू" रिश्ते है, तो इसका मतलब यह है कि हम उम्मीद नहीं कर सकते कि "प्रोग्रामर" उदाहरण व्यवहार IHuman के रूप में इलाज के दौरान अलग हो सकता है और IEngineer के रूप में व्यवहार किया जा सकता है?

उत्तर

14

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

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

+0

। यह बहुत अच्छा है। –

+0

@Iain: खुशी है कि आप इसका आनंद ले रहे हैं। जब आप समाप्त कर लें तो मुझे प्रतिक्रिया भेजें :) –

+0

क्या होगा यदि आपके पास केवल सार तत्वों के साथ सार तत्व था? यह एक इंटरफ़ेस से अलग कैसे होगा? मेरा मानना ​​है कि अगर इसमें केवल विधि हो तो कोई फर्क नहीं पड़ता। तो माइक्रोसॉफ्ट ने दो चीजें क्यों लाई हैं। विरासत है - एक रिलीज, इंटरफ़ेस कार्यान्वयन क्या है? –

5

मैं व्यवहार के अनुबंध के रूप में इंटरफेस के बारे में सोचता हूं। आईसीओपरपेरबल और आईन्यूमेरेबल जैसे इंटरफेस क्लासिक उदाहरण हैं।

आपके द्वारा दिए गए उदाहरण में, IHuman और IEngineer वास्तव में व्यवहार नहीं कर रहे हैं।

2

.NET ढांचे के डिजाइनर "है" (या "कर सकते हैं") संबंध को नामित करने के लिए इंटरफेस का उपयोग करते हैं, जबकि "एक है" विरासत का उपयोग करके लागू किया जाता है।

इस के लिए तर्क .नेट फ्रेमवर्क डेवलपर की मार्गदर्शिका के Choosing Between Classes and Interfaces अनुभाग में पाया जा सकता है:

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

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

2

वास्तव में है कि,, आदि IEnumerable

और

मानव, पशु, कुत्ता क्यों इंटरफेस के सबसे क्षमताओं और नहीं नाम तो आप

IComparable, ITestable है,

वैसे भी जैसा कि पहले ही उल्लेख किया गया है कि आपको व्यावहारिक होना है, जब मैं कोडिंग कर रहा हूं तो मुझे एक सामान्य नियम मिला है: कभी भी अवधारणाओं, सम्मेलनों या मानक प्रथाओं को नौकरी पाने के तरीके पर नहीं पहुंचने दें, बेहतर होगा अकादमिक से व्यावहारिक।

इसलिए यदि आप सुनिश्चित हैं कि इंटरफ़ेस वास्तव में आपके डिज़ाइन को बेहतर तरीके से फिट करते हैं, तो इसके लिए जाएं, इस तरह के प्रश्न के बारे में चिंता न करें।

4

बल्कि देर से इस सवाल का मिला लेकिन मैं। में झंकार के लिए

सी # में इंटरफेस चाहता था एक है-एक रिश्ता है, लेकिन नहीं है-एक-वस्तु। इसके बजाय, एक कार्यान्वयन है।

दूसरे शब्दों में, वर्ग फू कि Ibar, निम्न परीक्षण को लागू करता है के लिए:

Foo myFoo = new Foo(); 
return myFoo is IBar; 

सचमुच सच देता है। आप यह भी कह सकते हैं,

IBar bar = myArrayList[3] as IBar; 
Foo foo = bar as Foo; 

या, यदि किसी विधि को आईबार की आवश्यकता है, तो आप एक फू पास कर सकते हैं।

void DoSomething(IBar bar) { 
} 

static void Main() { 
    Foo myFoo = new Foo(); 
    DoSomething(myFoo); 
} 

जाहिर है, एक आईबार के पास कोई कार्यान्वयन नहीं है, इसलिए कर-संबंध संबंध भी लागू होता है।

interface IBar { void happy(); } 
class Foo : IBar 
{ 
    void happy() 
    { 
     Console.Write("OH MAN I AM SO HAPPY!"); 
    } 
} 
class Program 
{ 
    static void Main() 
    { 
     IBar myBar = new Foo(); 
     myBar.happy(); 
    } 
} 

लेकिन, उस मामले के लिए, यह वस्तु विरासत के बारे में भी सच है; वर्ग फू को प्राप्त करने वाले क्लास फू का एक ऑब्जेक्ट एक कैन-रिश्ते के साथ-साथ एक रिश्ते है, जैसे इंटरफ़ेस करता है। यह सिर्फ इतना है कि इसका कार्यान्वयन इसके लिए पूर्व-निर्मित था।

असली सवाल है-एक करने के लिए क्या, कर सकते हैं-do- क्या? एक विरासत वर्ग वस्तु है-एक करने के लिए [मूल उदाहरण] और कर सकते हैं-do- [माता पिता के व्यवहार], जबकि एक अंतरफलक के एक कार्यान्वयन है-एक- [इंटरफेस कार्यान्वयन] और इसलिए-do- कर सकते हैं [ इंटरफ़ेस व्यवहार]

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

अपनी पुस्तक जॉन पढ़ना

HTH, जॉन

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