2013-07-29 12 views
12

में नहीं है मेरे पास एक साधारण सी # प्रश्न है (इसलिए मुझे विश्वास है)। मैं भाषा के साथ शुरुआत कर रहा हूं और मैं उन्हें लागू करने वाले इंटरफेस और कक्षाओं के बारे में एक समस्या में भाग गया। समस्याक्लास विधि जो इंटरफ़ेस

मैं इंटरफ़ेस iA

interface iA 
{ 
    bool method1 
    bool method2 
    bool method3 
} 

और 3 वर्गों कि इंटरफ़ेस को लागू है: वर्ग B, C और D

class B : iA 
{ 
    public bool method1 
    public bool method2 
    public bool method3 
} 

वर्ग बी एक और तरीका है कि में नहीं है था इंटरफ़ेस, मान लें method4() और मेरे पास निम्न है:

iA element = new B(); 

और फिर मैं का प्रयोग करेंगे:

element.method4(); 

मैं कह रहा है कि मैं एक method4() उस प्रकार iA का पहला तर्क लेता नहीं है एक त्रुटि मिलेगा।

सवाल यह है: क्या मेरे पास इंटरफ़ेस प्रकार का ऑब्जेक्ट है और कक्षा के साथ तत्काल हो सकता है और क्या ऑब्जेक्ट कक्षा से एक विधि है, एक विधि जो इंटरफ़ेस में नहीं है?

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

+1

'अगर (तत्व टाइपोफ (बी)) ((बी) तत्व)। Method4(); 'यह – wudzik

+5

मदद कर सकता है एक नया नया उपयोगकर्ता स्पष्ट और अच्छी तरह से स्वरूपित प्रश्न पूछ रहा है। यह दुर्लभ है, बधाई और स्वागत है। :) – Otiel

+0

अच्छा सवाल। +1 यदि आप असली परिदृश्य देते हैं, तो हम सबसे अच्छे डिजाइन अपमान पर सलाह दे सकते हैं। –

उत्तर

2

आपको इंटरफ़ेस प्रकार को कक्षा प्रकार में डालना होगा; आम तौर पर हम इसे रूप के माध्यम से कार्य करें:

B b = element as B; // <- try cast element as B 

    if (!Object.RefernceEquals(null, b)) { // <- element is B or can be legaly interpreted as B 
    b.method4(); 
    } 

का लाभ "के रूप में" यह है कि केवल एक डाली आपरेशन, जबकि "है" और (बी) दो डाले क्या करना है है।

4

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

if(element is B) 
{ 
    ((B)element).method4(); 
} 
+2

साइड नोट: यह सुनिश्चित करने के लिए कि तत्व 'बी' – wudzik

+0

है, तो आप' if (element टाइप टाइप (बी)) जोड़ सकते हैं, हालांकि आप शायद ऐसा नहीं करना चाहते हैं? –

+0

एक अच्छा बिंदु है। मैं इसे अपने उत्तर में जोड़ दूंगा। –

2

:

iA element = new B(); 
((B)element).method4(); 

wudzik ने सुझाव दिया रूप में, आप अगर elemnt सही प्रकार की है की जाँच करनी चाहिए इस।

interface iA 
{ 
    bool method1(); 
    bool method2(); 
    bool method3(); 
} 

interface IFoo : iA 
{ 
    bool method4(); 
} 

class B : IFoo 
{ 
    public bool method1() {} 
    public bool method2() {} 
    public bool method3() {} 
    public bool method4() {} 
} 

IFoo element = new B();  
element.method4(); 

एनबी: सी # इंटरफेस के लिए राजधानी I उपसर्ग का उपयोग करने का प्रयास करें।

+0

यह टाइपशेकिंग और कास्टिंग से बचाता है, लेकिन अब आपके पास एक अलग वस्तु है, IFoo। यदि उपयोगकर्ता के पास आईए ऑब्जेक्ट है, तो अभी भी यह जांचने की आवश्यकता होगी कि वह ऑब्जेक्ट एक IFoo (और इसे कास्ट करें), विधि 4 चलाने में सक्षम होने के लिए। –

+1

हां, लेकिन डिजाइन-वार कंक्रीट प्रकारों के मुकाबले इस तरह के इंटरफेस के खिलाफ काम करना बेहतर है। यह एक समाधान है जो बेहतर पैमाने पर स्केल करता है क्योंकि अब विभिन्न प्रकार के इंटरफेस को लागू करने के लिए यह आसान है। –

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