2010-03-03 18 views
5

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

interface ICommon {...} // Members common to all widgets 
interface IWidget1 {...} // specialized members of widget type 1 
interface IWidget2 {...} // specialized members of widget type 2 

मैं या इंटरफेस में भाग होने के बीच चयन करने की कोशिश कर रहा हूँ, कक्षा में। तो, विशेष रूप से, मैं या तो इसे इस तरह कर सकते हैं:

interface IWidget1 : ICommon {...} 
interface IWidget2 : ICommon {...} 
class Widget1 : IWidget1 {...} 
class Widget2 : IWidget2 {...} 

... या इस तरह ...

class Widget1: ICommon, IWidget1 {...} 
class Widget2: ICommon, IWidget2 {...} 

कोई सम्मोहक एक ही रास्ता या अन्य जाने के लिए कारण है?

अपडेट: क्या कक्षाएं COM-view होने पर उत्तर को प्रभावित करती हैं?

उत्तर

6

आपको इंटरफ़ेस विरासत का चयन करना चाहिए यदि केवल एक प्रकार लागू होता है IWidget1 भी आईकॉमॉन को लागू करना चाहिए। किसी भी मामले में, कक्षा अलग-अलग IWidget1 और ICommon को लागू करने जा रही है। केवल अंतर यह है कि यदि आप आईकॉमेट 1 से आईविडेट 1 "व्युत्पन्न" करते हैं तो आप इस तथ्य को लागू करते हैं कि IWidget1 भी एक आईकॉमॉन होना चाहिए।

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

जो भी आप चुनते हैं वह COM दृश्यता को प्रभावित नहीं करेगा। यदि मैं सही ढंग से याद करता हूं तो .NET अभी भी इंटरफ़ेस को अलग से निर्यात करेगा।

+0

से IWidgetX इंटरफेस को बेहतर नहीं प्राप्त करेंगे, ठीक है, हाँ। सभी विजेट प्रकारों को आईसीओएमओएन लागू करना होगा। प्रत्येक के लिए प्रत्येक विजेट में इसके कार्यान्वयन को लागू करने के लिए यह कारण है। –

+1

फिर हाँ आप निश्चित रूप से IWidget1 आईसीओएमओएन से प्राप्त होना चाहिए। – Josh

3

अपने आप को उत्तर देने में मदद करने के लिए लिस्कोव प्रतिस्थापन सिद्धांत का उपयोग करें।

यदि IWidget1 को ICOMon1 के संदर्भ में काम कर रहे सभी ग्राहकों के लिए प्रतिस्थापित किया जा सकता है, तो आप ICOMon1 से IWidget1 का उत्तराधिकारी प्राप्त कर सकते हैं। यदि एकाधिक इंटरफेस को लागू करने वाले वर्ग के साथ नहीं जाते हैं।

+0

क्या यह एक ही परिणाम उत्पन्न नहीं करता है? –

+0

@ टिम - क्या आप विस्तृत कर सकते हैं? मेरा मतलब यह था कि यदि आप एक आईडॉडम 1 ऑब्जेक्ट को आईकॉमोन 1 की अपेक्षा रखने वाले सभी कोड के लिए प्रतिस्थापित कर सकते हैं और यह आपके डोमेन में IWidget1 इकाई रखने का एहसास है, तो आप इंटरफ़ेस विरासत दृष्टिकोण के साथ जा सकते हैं। यदि नहीं, तो एक ही कक्षा कई इंटरफेस लागू करें। – Gishu

+0

ठीक है मैं देखता हूं कि आपका क्या मतलब है। धन्यवाद। एक उपयोगी नए परिप्रेक्ष्य के लिए –

0

उत्तराधिकार कक्षा या इंटरफ़ेस की विशेषता/व्यवहार पर निर्भर है। यदि IWidget1 और IWidget2 में व्यवहार ICommon में सभी व्यवहार शामिल हैं, तो आप निश्चित रूप से IWidget1 : ICommon और IWidget2 : ICommon जैसे उत्तराधिकारी प्राप्त कर सकते हैं और ComVisible से संबंधित कोई समस्या नहीं है। यह केवल ओओपीएस अवधारणा है।

1

एक और विचार है कि मुझे लगता है कि अन्य उत्तरों में ध्यान नहीं दिया गया था।

आप ICommon से IWidgetX निकाले जाते हैं, और फिर एक विजेट दोनों IWidget1 और IWidget2 के व्यवहार आप एकाधिक इंटरफेस कार्यान्वयन कर सकते हैं है कि साथ आने हैं:

class Widget3 : IWidget1, IWidget2 

दोनों थे इंटरफ़ेस ICommon से प्राप्त किए गए हैं, तो आपके कक्षा में आईसीओएमओएन के दो कार्यान्वयन होंगे। यह एक बड़ी समस्या नहीं है और multiple interface implementation द्वारा संभाला जा सकता है, लेकिन यह तर्क बदलता है।

दूसरी ओर, यदि आप ICommon से IWidgetX प्राप्त नहीं है, तो आप सिर्फ तीनों को लागू करने और नहीं स्पष्ट कार्यान्वयन से निपटने के लिए कर सकते हैं:

class Widget3 : IWidget1, IWidget2, ICommon 

तो, अगर यह कल्पना है कि आप की आवश्यकता हो सकती है कि इस तरह की विजेट 3 कक्षा - आप आईकॉमटन

+0

+1 धन्यवाद। –

+0

धन्यवाद टिम - हालांकि यह पता चला है कि मैं बिल्कुल सही नहीं हूँ! मैंने इस एकाधिक इंटरफ़ेस कार्यान्वयन की चीज़ में थोड़ा गहरा खोला है और वास्तव में आपके पास आईसीओमन के दो कार्यान्वयन नहीं हैं - यदि आपके पास था, तो कास्ट (आईसीओएमओएन) (नया विजेट 3)) अनजान होगा। मैंने स्थिति को और अधिक विस्तार से बताया [इस ब्लॉग पोस्ट में] (http://stefankiryazov.blogspot.com/2011/09/luke-whos-your-father-multiple.html) आईसीडॉन से IWidgetX प्राप्त करने के खिलाफ तर्क हालांकि अभी भी आंशिक रूप से मान्य है – Vroomfundel

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