2009-08-02 20 views
11

मैं कोड में मेरी परिदृश्य के बारे में समझाकर शुरू कर देंगे:सी # .NET - मैं विरासत के साथ काम करने के लिए टाइपऑफ() कैसे प्राप्त कर सकता हूं?

public class A { } 

public class B : A { } 

public class C : B { } 

public class D { } 

public class Test 
{ 
    private A a = new A () ; 
    private B b = new B () ; 
    private C c = new C () ; 
    private D d = new D () ; 

    public Test () 
    { 
     // Evaluates to "false" 
     if (a.GetType == typeof(B)) { } //TODO: Add Logic 

     // Evaluates to "true" 
     if (b.GetType == typeof(B)) { } //TODO: Add Logic 

     // I WANT this to evaluate to "true" 
     if (c.GetType == typeof(B)) { } //TODO: Add Logic 

     // Evaluates to "false" 
     if (d.GetType == typeof(B)) { } //TODO: Add Logic 
    } 
} 

महत्वपूर्ण लाइन यहाँ पर ध्यान करने के लिए है:

if (c.GetType == typeof(B)) { } 

मुझे विश्वास है कि वास्तव में इस वसीयत का मूल्यांकन " झूठा ", क्योंकि टाइपऑफ (बी) और टाइपोफ (सी) दोनों दिशाओं में एक-दूसरे के बराबर नहीं हैं। (सी एक बी है, लेकिन बी जरूरी नहीं है सी)

लेकिन मुझे जो चाहिए वह किसी तरह की स्थिति है जो इसे ध्यान में रखेगी। मैं कैसे बता सकता हूं कि कोई ऑब्जेक्ट बी है या इससे प्राप्त कुछ भी है?

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

मुझे ऐसी स्थिति चाहिए जो मेरे लिए यह जांच करेगी। इसे किस तरह पूर्ण कर सकते है?

+0

आपको जहां संभव हो इस तरह के तर्क से बचना चाहिए। जब आपको यह निर्धारित करना होता है कि किसी वस्तु का व्युत्पन्न प्रकार क्या है, तो आप बहुरूपता का अच्छा उपयोग नहीं कर रहे हैं। –

+0

स्टीवन सूडिट के उत्तर पर मेरी टिप्पणी देखें। – Giffyguy

उत्तर

36

तुम बस is उपयोग कर सकते हैं:

if (c is B) // Will be true 

if (d is B) // Will be false 
+0

ओपी में एकमात्र वास्तविक प्रश्न के जवाब के रूप में: "मैं कैसे बता सकता हूं कि कोई वस्तु बी है या इससे प्राप्त कुछ भी है?" यह सही जवाब है। मेरा धागा शीर्षक का उत्तर है, लेकिन वर्णित समस्या के लिए कम उपयुक्त है। –

+0

आह, पर्याप्त सच है। तुम सही हो, मेरा सवाल थोड़ा सा झुका हुआ है। मेरी गलती। – Giffyguy

+0

+1 यह इस समस्या का सही समाधान है। वास्तव में –

19

संपादित करें: यह थ्रेड शीर्षक में प्रश्न का उत्तर देता है। cdm9002 में पूर्ण पोस्ट में वर्णित समस्या का बेहतर उत्तर है।

typeof(B).IsAssignableFrom(c.GetType()) 
+2

सीडीएम 9 002 का उत्तर बेहतर है, क्योंकि यह प्रतिबिंब का उपयोग नहीं करता है। –

+0

@pb: यदि आप तकनीकी प्राप्त करना चाहते हैं, तो दूसरा उत्तर विरासत के साथ 'टाइपोफ़' का उपयोग नहीं करता है। जैसा कि आप मेरे संपादन से देख सकते हैं, मैं पहले जवाब का दावा करने वाला नहीं हूं जिसका मैंने सोचा था कि सबसे उपयुक्त है।:) –

+2

यह न केवल एक बिल्कुल सही उत्तर है, बल्कि इसके अलावा मामले में भी शामिल है जब आपके पास किसी भी कक्षा के उदाहरण नहीं हैं, लेकिन फिर भी यह निर्धारित करना चाहते हैं कि दो प्रकार के बीच विरासत संबंध है या नहीं। –

4

यह बहुरूपता के लिए एक नौकरी की तरह दिखता है के रूप में विशिष्ट वर्गों के लिए परीक्षण के साथ एक बड़ा स्विच बयान का विरोध किया।

+0

। कक्षा ए पर वर्चुअल विधि रखें, सबक्लास में उपयुक्त के रूप में ओवरराइड करें, फिर इस वर्चुअल विधि को कॉल करें। –

+1

कितना कठोर !! Haha। मेरा वर्ग तर्क वास्तव में इस गड़बड़ की तरह दिखता नहीं है। मुझे बस यह समझने की जरूरत है कि इस स्थिति को कैसे किया जाए। मैं अमूर्त बेस क्लास में एक PropertyChangedCallback विधि लिख रहा हूं, और मुझे एक सुरक्षा स्थिति की आवश्यकता है जो सुनिश्चित करेगा कि निर्भरता ऑब्जेक्ट पैरामीटर मेरी बेस क्लास से प्राप्त ऑब्जेक्ट है। यदि नहीं, तो मैंने एक त्रुटि फेंक दी या मेरा तर्क रद्द कर दिया। इस उदाहरण में पॉलीमोर्फिज्म सहायक नहीं है। – Giffyguy

+1

ठीक है, तो "है" का उपयोग करना पर्याप्त होना चाहिए। –

0
दृश्य   स्टूडियो   2008 के साथ

VB.NET के लिए, आप जाँच कर सकते हैं इसे पसंद:

var maybeB = c as B; 
if (maybeB != null) { 
    // make use of maybeB 
} 

:

'MyTextBox control is inherited by Textbox 
If Ctl.GetType.Name = "MyTextBox" then  

End If 
1

(c is B) जांच के लिए एक विकल्प के रूप में, आप भी कर सकते हैं is का उपयोग करते समय के रूप में c के उपयोग के लिए कुछ मामलों में इसे प्राथमिकता दी जाती है, आपको वैसे भी डालना होगा।

0
typeof(B).IsInstanceOfType(c) 

सैम Harwell से ऊपर जवाब की तरह, कभी कभी आप प्रकार "बी" एक चर में है, तो आप "है" ऑपरेटर के बजाय प्रतिबिंब उपयोग करने की आवश्यकता हो सकती है।

मैंने सैम के समाधान का उपयोग किया, और जब रिशेर्पर ने यह सुझाव दिया तो सुखद आश्चर्यचकित हुआ।

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

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