2012-05-02 8 views
9

का उत्तराधिकारी नहीं है। मुझे उम्मीद है कि यहां कोई व्यक्ति यह बता सकता है कि मैं क्या गलत धारणाएं बना रहा हूं। सी # 4.0 में, मेरे पास 2 इंटरफेस और एक कक्षा है जो दोनों को लागू करती है। एक विधि में मैं पहली बार इंटरफ़ेस के प्रकार के साथ एक चर घोषित, वर्ग है कि दोनों इंटरफेस को लागू करता है और किसी भी तरह यह निम्न कोड में की तरह दूसरे इंटरफ़ेस करने के लिए सफलतापूर्वक डाल सकता का उपयोग कर इसे का दृष्टांत:एक इंटरफ़ेस को किसी अन्य इंटरफ़ेस में कास्ट करना कि यह

public interface IFirstInterface 
    { 
     void Method1(); 
    } 

    public interface ISecondInterface 
    { 
     void Method2(); 
    } 

    public class InterfaceImplementation : IFirstInterface, ISecondInterface 
    { 
     public void Method1() { } 
     public void Method2() { } 
    } 

    public class SomeClass 
    { 
     public void SomeMethod() 
     { 
      IFirstInterface first = new InterfaceImplementation(); 
      first.Method1(); 

      // Shouldn't the next line return null? 
      ISecondInterface second = first as ISecondInterface; 
      // second is not null and the call to Method2() works fine 
      second.Method2(); 
     } 
    } 

मैं यह समझने की कोशिश कर रहा है कि कास्टिंग सफल क्यों है। हां, कक्षा दोनों इंटरफेस लागू करती है, लेकिन मुझे लगता है कि पहले चर के रूप में IFirstInterface (जो ISecondInterface से प्राप्त नहीं है) के रूप में घोषित किया गया है, कास्टिंग अभी भी विफल होना चाहिए।

मैंने अपने कोड को अन्य तरीकों से पुनर्गठन करने का भी प्रयास किया है, जैसे कि 'as' का उपयोग न करें, लेकिन कलाकार अभी भी सफल है।

मुझे क्या याद आ रही है?

उत्तर

7

आपके उदाहरण से, आपको किसी भी कार्यक्षमता को कॉल करने से पहले परीक्षण प्रकार के प्रकार से अच्छा होना चाहिए। पहली रचना पूरी तरह से योग्य "इंटरफेस कार्यान्वयन" तैयार करेगी जो दोनों इंटरफेस का समर्थन करती है। हालांकि, आप इसे केवल पहले इंटरफ़ेस के घोषित प्रकार में डाल रहे हैं। तो "पहले" ऑब्जेक्ट के परिप्रेक्ष्य से, यह केवल IFirstInterface कार्यान्वयन के रूप में जुड़े किसी भी चीज़ की परवाह करता है।

अब, आप पर दूसरी बार ... भले ही आपने ऑब्जेक्ट बनाया है, फिर भी आप पूछ सकते हैं ... वैसे ... क्या आप भी एक दूसरा इंटरफेस हैं? यदि ऐसा है, तो यह करें ...

IFirstInterface first = new InterfaceImplementation(); 

if(first is ISecondInterface) 
    // typecast since the second interface is legit, then call it's method 2 
    ((ISecondInterface)first).Method2(); 
+0

यह पुष्टि करता है कि मैंने क्या सोचा था। धन्यवाद –

+0

बहुत से धन्यवाद, वास्तव में इसकी आवश्यकता है। +1 (+10 अगर मैं कर सकता था)। – Arjang

0

यदि आप ठोस वस्तु के दृष्टिकोण से देखते हैं, तो आप कह सकते हैं "मैं एक IFirstInterface हूं, लेकिन मैं भी एक ISecondInterface हूं"। क्या यही मतलब है तुम्हारा? आपके द्वारा वर्णित प्रश्न, विरासत/कार्यान्वयन श्रृंखला के अंदर ही कास्टिंग में समाप्त होगा।

1

एकमात्र चीज जो आप खो रहे हैं वह यह है कि यह वास्तव में कैसे होना है, और यह एक उपयोगी सुविधा है, समस्या नहीं। कास्टिंग करते समय, आप मूल रूप से यह कहकर कोड के बारे में सोच सकते हैं, "मुझे इस बात की परवाह नहीं है कि मुझे इस वस्तु का प्रकार क्या पता था, मैं देखना चाहता हूं कि इसे टाइप टी में परिवर्तित किया जा सकता है या नहीं। इस मामले में, अंतर्निहित वस्तु InterfaceImplementation प्रकार है, इस तथ्य के बावजूद कि इसे वर्तमान में IFirstInterface के नाम से जाना जाता है, इसका उत्तर यह है कि हां, इसे ISecondInterface में परिवर्तित किया जा सकता है।

0

पॉलिमॉर्फिज्म में आपका स्वागत है। ऑब्जेक्ट first हमेशा इंटरफ़ेस कार्यान्वयन का एक उदाहरण होने जा रहा है। आप इसका संदर्भ कैसे चुनते हैं यह इस बात को प्रभावित नहीं करता है कि ऑब्जेक्ट वास्तव में "क्या है।" इस तरह अमूर्तता की अवधारणा पूरी तरह से काम करती है।

3

उदाहरण इंटरफ़ेस लागू करने के लिए उदाहरण first अंक का वास्तविक प्रकार। तो जाहिर है कि Method1 और Method2 ऑब्जेक्ट पर उपलब्ध हैं।

first के स्थिर प्रकार केवल आप एक्सेस Method1 सुविधा देता है। second का स्थिर प्रकार केवल आपको Method2 तक पहुंचने देता है। मैं आप इंटरफेस का उपयोग करके ऑब्जेक्ट का संदर्भ घोषित करता हूं, आप बस चयनित अनुबंध (इंटरफ़ेस) को पूरा करने वाले ऑब्जेक्ट के रूप में इंस्टेंस को देखने के लिए चुनते हैं।

InterfaceImplementation दोनों इंटरफ़ेस लागू करता है, आपके पास इंटरफ़ेस का उपयोग करके इंस्टेंस का जिक्र करने का विकल्प होता है।

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