2009-04-07 18 views
9

यदि मेरे पास बेस क्लास और दो व्युत्पन्न कक्षाएं हैं, और मैं हाथ से दो व्युत्पन्न कक्षाओं के बीच कास्टिंग लागू करना चाहता हूं, तो क्या ऐसा करने का कोई तरीका है? (सी # में)ओवरराइडिंग (कास्ट)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

आम तौर पर मैं Imp_A से कास्टिंग हो जाएगा -> Imp_B और मैं चाहता हूँ ई सूची में अंतिम मूल्य 'कर सकते हैं पर' होने के लिए। इसके अलावा, क्या होगा यदि तीन या अधिक कार्यान्वयन कक्षाएं (जैसे वेतन, प्रति घंटा, सलाहकार, और पूर्व कर्मचारी।)

भले ही यह वास्तुशिल्प रूप से ध्वनि हो (मैं पूरे आवेदन का वर्णन नहीं कर सकता और संक्षेप में नहीं हो सकता) क्या यह संभव है?

मैं एक कनवर्टर लिखने जा रहा था, सिवाय इसके कि एक कनवर्टर आईपीबीआई कक्षा का एक नया ऑब्जेक्ट तैयार करेगा, जिसकी मुझे आवश्यकता नहीं है क्योंकि 'कर्मचारी' केवल किसी एक विकल्प में से एक होगा पहर। यदि आप एक IMPA "इलाज" के लिए

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

आप वास्तव में ImpB से निकाले जाते हैं नहीं कर सकते, यह नामुमकिन है:

-Devin

उत्तर

19

आपको explicit या implicit ऑपरेटर को लागू करना होगा।

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

अब आप निम्न कार्य कर सकते हैं।

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

ध्यान रखें कि यह (जाहिर है) वास्तव में एक पूरी नई Imp_B वस्तु बना देगा। – mquander

+0

यह सही है। लेकिन, जैसा कि प्रबंधक का उल्लेख है, यह एक नई वस्तु है, जो मुझे विश्वास है कि यह अपरिहार्य है। लेकिन क्या इसका मतलब यह है कि "ए" जीसीडी नहीं होगा जब तक कि यह गुंजाइश से बाहर न हो जाए, भले ही मैं इसे कभी भी उपयोग न करें (एक Imp_A के रूप में)? – DevinB

+0

हां, यह केवल तभी एकत्रित किया जाएगा जब यह दायरे से बाहर हो जाता है और अब आप इसके संदर्भ में कोई संदर्भ नहीं रखते हैं। –

2

मैं सुझाव देंगे आप इस तरह Imp_B लिखते हैं, यदि संभव हो तो एक आईएमबी के रूप में ऑब्जेक्ट पारदर्शी रूप से जिस तरह से आप चाहते हैं, क्योंकि वे स्मृति में एक ही चीज़ नहीं हैं। तो, एक स्पष्ट रूपांतरण लागू करें।

+0

माफ करना, तुम सही हो, मैं भी एक-डी – DevinB

+0

निकाल देंगे, इन कक्षाओं में और अधिक जटिल, कुछ वेरिएबल है कि प्रत्येक के लिए विशेष कर रहे हैं के साथ किया जाएगा। और फिर कुछ चर (जैसे ई) जो सीधे संबंधित हैं, लेकिन जरूरी नहीं है। – DevinB

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