2010-08-16 13 views
6

मैं समझता हूं कि कोई भी संग्रह (यहां मैं नियमित गैर-जेनेरिक के बारे में बात कर रहा हूं) को शब्दकोश के मामले में नियमित ऑब्जेक्ट संग्रह या आईडीिनेर के आईसीओलेक्शन, आईन्यूमेरेबल और आईलीस्ट को लागू करना चाहिए था।हम इंटरफेस को दोबारा क्यों लागू करते हैं?

IList ICollection से ली गई है और IEnumerable

ICollection IEnumerable

से प्राप्त

यह सिर्फ एक संग्रह बनाने के लिए पर्याप्त नहीं है [फिर भी, सवाल मैं पूछ नहीं संग्रह के लिए विशिष्ट है] (जैसे ArrayList) IList लागू?

ऑब्जेक्ट ब्राउज़र में यह प्रदर्शित करता है कि संग्रह कक्षाएं (उदा। ArrayList) IList, ICollection, और IENumerator को कार्यान्वित कर रही हैं।

मैं समझता हूं कि भले ही हम सभी तीन संग्रह निर्दिष्ट करते हैं, नेट। केवल परिभाषाओं को स्वीकार करने जा रहा है।

लेकिन मेरे सवाल है,

  1. वहाँ किसी भी सबसे अच्छा अभ्यास या सिफारिश हमें संग्रह वर्ग (या किसी भी इस के समान वर्ग) के लिए सभी तीन इंटरफेस निर्दिष्ट करने के लिए गाइड है कि है?

  2. या क्या यह ऑब्जेक्ट ब्राउज़र का प्रोपरी है जो इसे 3 अलग-अलग कार्यान्वयन के रूप में प्रदर्शित करता है? [बस जांच की और पाया कि यह ऑब्जेक्ट ब्राउज़र की संपत्ति नहीं है। वस्तु ब्राउज़र बस इंटरफ़ेस वर्ग परिभाषा में निर्दिष्ट]

+4

घोषणाओं आपके द्वारा बताई गई निरर्थक हो सकता है, लेकिन वे पुनरावर्ती नहीं हैं। – dthorpe

उत्तर

1

मेरा मानना ​​है कि यह सिर्फ या तो डेवलपर्स के लिए स्पष्ट होना, या मदद करने के लिए इंटरफ़ेस संरचना लागू है। मेरा मतलब है, कल्पना करें कि आपके पास डेटा संरचना वर्गों के लिए एक इंटरफ़ेस है, और आप IDataObject को लागू करते हैं। IDataObject तब लागू करने योग्य, और iloggable लागू करता है। आपके द्वारा बनाई गई नियमित कक्षाएं केवल IDataObject को कार्यान्वित कर सकती हैं, लेकिन क्या होगा यदि IDataObject के निर्माता बाद में कार्यान्वयन को बदल दें और ILoggable को छोड़ दें? यह आपके कोड की कार्यक्षमता को बदल सकता है। तो, यह को रोकने के लिए, जब आप अपने वर्ग कि IDataObject से विरासत बनाने के लिए, आप स्पष्ट रूप से कह सकते हैं कि आप भी ISecurable और ILoggable लागू करना चाहते हैं, सुरक्षा के लिए।

मैं क्यों वे कि IList के साथ किया था निश्चित रूप से पता नहीं है, लेकिन उन दो वजहों पर मेरे सबसे अच्छे अनुमान हैं।

1

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

interface IAnimal { 
    public void Yelp(); 
} 

और निम्न वर्ग:

class Dog { 
    public void Yelp() { 
    // do yelping 
    } 
} 

उदाहरण के लिए, मैं निम्नलिखित हो सकता है

अब, कुत्ता वास्तव में चिल्लाता है; हालांकि, क्योंकि यह घोषणा नहीं करता है कि यह IAnimal लागू करता है, मैं ऐसा नहीं कर सकते निम्नलिखित:

class Dog : IAnimal { 
    public void Yelp() { 
    // do yelping 
    } 
} 
+0

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

2
:

IAnimal poodle = new Dog(); 
poodle.Yelp(); 

आदेश कुत्ते के लिए इस परिभाषा को ठीक करने के लिए करने के लिए परिवर्तित किया जाना चाहिए

क्या यह संग्रह करने के लिए पर्याप्त नहीं है (जैसे ArrayList) IList लागू करें?

यह पर्याप्त है। एक वर्ग की घोषणा:

public MyCollectionClass : IList { 
} 

कि आपके MyCollectionClass मतलब होगा IList, ICollection, और IEnumerable लागू करता है।

ऑब्जेक्ट ब्राउज़र में यह संग्रह कक्षाएं प्रदर्शित कर रहा है (उदा।ArrayList) IList, ICollection, और IENumerator लागू कर रहे हैं।

यह या तो ऑब्जेक्ट ब्राउज़र का विवरण है, या फिर बेस क्लास ने सभी इंटरफेस निर्दिष्ट करके संग्रह कक्षाओं को लागू किया है। हालांकि, ऐसा करने के लिए वास्तव में कोई ड्राइविंग कारण नहीं है।

5

I मानते हैं यह केवल ऑब्जेक्ट ब्राउज़र है जो इसे इस तरह प्रदर्शित करता है। मैं सिर्फ यह कोशिश की है: वस्तु ब्राउज़र में

using System.Collections; 
using System.Collections.Generic; 

public class Foo : IEnumerable<int>, IEnumerable 
{ 
    public IEnumerator<int> GetEnumerator() { return null; } 
    IEnumerator IEnumerable.GetEnumerator() { return null; } 

} 

public class Bar : IEnumerable<int> 
{ 
    public IEnumerator<int> GetEnumerator() { return null; } 
    IEnumerator IEnumerable.GetEnumerator() { return null; } 
} 

लोड हो रहा है इस दोनों वर्गों पर दोनों इंटरफेस दिखाया।

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

सामान्य में, हालांकि, आप निश्चित रूप से सभी इंटरफ़ेस निर्दिष्ट करने के लिए की जरूरत नहीं है, और मैं आम तौर पर ऐसा नहीं होता।

+0

यह मेरे लिए वीएस -2010 में काम नहीं करता है। इसके अलावा, मेरे कस्टम वर्गों के लिए, ऑब्जेक्ट ब्राउज़र अंतर्निहित इंटरफेस को छोड़ रहा है। – ladenedge

+0

@ladenedge: यह VS2010 में मेरे लिए, भी था (VS2010 प्रो जो अगर प्रासंगिक है)। यह मुझे "बेस प्रकार" में इंटरफेस दिखा रहा है। यह आपको वहां क्या दिखा रहा है? –

+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। लेकिन यह ऑब्जेक्ट ब्राउज़र की संपत्ति नहीं है। मैंने पाया कि कुछ समय पहले। अगर हम इसे केवल IList से प्राप्त करते हैं, तो ऑब्जेक्ट ब्राउज़र केवल IList दिखाता है। यदि हम दोनों IList और IENumerable से प्राप्त होते हैं, तो ऑब्जेक्ट ब्राउज़र दोनों दिखाता है। – SaravananArumugam

2

अब, मुझे लगता है कि आप कह रहे हैं, यह देखते हुए

interface IA {}; 
interface IB : IA {}; 
interface IC : IB {}; 

क्या बीच का अंतर है:

class MyClass : IC {}; 

और

class MyClass : IA, IB, IC {}; 

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

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