2012-09-29 10 views
5

बेस, 10.13 Destructorsक्यों उस उदाहरण की विरासत श्रृंखला में विनाशकों को कम से कम व्युत्पन्न से व्युत्पन्न किया जाता है? सी # विनिर्देश पर

"जब एक उदाहरण विलुप्त है, कि उदाहरण के विरासत श्रृंखला में विनाशकर्ता , कहा जाता है क्रम में, सबसे कम से कम प्राप्त होने वाले व्युत्पन्न से।"

मेरे प्रश्न हैं:

क्यों विनाशकर्ता, कहा जाता है क्रम में, सबसे व्युत्पन्न से कम से कम व्युत्पन्न के लिए? क्यों कम से कम व्युत्पन्न या अन्य आदेश से व्युत्पन्न नहीं किया जाता है?

+1

कल्पना कीजिए कि आप एक बड़ा संरचना dissasembling रहे हैं। आप छोटे हिस्सों से शुरू होते हैं और –

+0

ऊपर जा रहे हैं धन्यवाद। हाय क्यूओंग, मेरे प्रश्न में सुधार के लिए धन्यवाद :-) –

उत्तर

4

क्योंकि वस्तुओं को कम से कम व्युत्पन्न से व्युत्पन्न से बनाया गया है, इसलिए उन्हें व्युत्पन्न न किए गए सबसे अधिक व्युत्पन्न से नीचे फेंकना होगा।

व्युत्पन्न वर्ग बेस क्लास के बारे में जानता है, लेकिन बेस क्लास व्युत्पन्न कक्षा के बारे में नहीं जानता है। यदि आप ऑब्जेक्ट को कम से कम व्युत्पन्न कक्षा से सबसे व्युत्पन्न कक्षा में फाड़ देंगे, तो बेस क्लास उन चीजों को हटा देगा जो व्युत्पन्न वर्ग को प्रक्रिया में आवश्यकता हो सकती है।

उदाहरण के लिए विचार करें कि आधार वर्ग वस्तुओं की एक सूची है:

public class MyBase { 

    public List<SomeObject> list; 

    public MyBase(){ 
    list = new List<SomeObject>(); 
    list.Add(new SomeObject()); 
    list.Add(new SomeObject()); 
    list.Add(new SomeObject()); 
    } 

    ~MyBase() { 
    foreach (SomeObject obj in list) { 
     obj.Cleanup(); 
    } 
    list.Clear(); 
    } 

} 

व्युत्पन्न वर्ग सूची में प्रत्येक आइटम के लिए कुछ कहते हैं:

public class MyDerived : MyBase { 

    public MyDerived() { 
    foreach (SomeObject obj in list) { 
     obj.SomeProperty = new Handler(); 
    } 
    } 

    ~MyDerived(){ 
    foreach (SomeObject obj in list) { 
     obj.SomeProperty.Cleanup(); 
    } 
    } 

} 

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

(हालांकि ध्यान दें कि IDisposable सामान्य रूप से वस्तुओं की नियंत्रित सफाई को संभालने के लिए एक बेहतर विकल्प है।)

+0

धन्यवाद गुफा.बीटीडब्ल्यू, यह मेरा पहला समय है, क्या मुझे पता है कि सही उत्तर के जवाब को कैसे चिह्नित किया जाए? –

+0

@jacky_shen: प्रत्येक प्रश्न के बगल में एक चेक मार्क वाला एक बटन है, जिसका उपयोग आप सही उत्तर को चिह्नित करने के लिए कर सकते हैं। अक्सर पूछे जाने वाले प्रश्न में देखें: http://stackoverflow.com/faq#howtoask – Guffa

6

संभवतः, ऐसा इसलिए है क्योंकि व्युत्पन्न वर्ग को बेस क्लास के सदस्यों का ज्ञान है, और उन्हें विनाशक में उपयोग करने की आवश्यकता हो सकती है। यदि आधार निर्माता को पहले कहा जाता है, तो सदस्य अनुपलब्ध हो सकते हैं, या ऑब्जेक्ट की स्थिति को मूल विनाशक द्वारा अमान्य स्थिति में अन्यथा रखा जा सकता है।

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

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