2010-03-04 10 views
5

अगर मैं X, Y, Z तरह कक्षाएं A, B, C, D, E, और इंटरफेस है, और की तरह एक प्रणाली मॉडल है:मेमोरी आवंटन .NET में गहरी विरासत

class B : A, X 
class C : B, Y 
class D : C, Z 
class E : D 

तो A एक सार आधार वर्ग है और ई है ब्याज की कक्षा, जब मैं ई का उदाहरण बनाता हूं, तो क्या यह बदले में A, B, C, D, X, Y, Z के उदाहरण E के अतिरिक्त बना देगा?

यदि ऐसा है, तो क्या यह एक बड़ा प्रदर्शन ओवरहेड बनाएगा? स्मृति नहीं, लेकिन रनटाइम और जीसी के अनुसार।

उत्तर

7

हाँ, यह ए, बी, सी और डी
की 'एम्बेडेड' उदाहरण बना नहीं, यह एक्स, वाई और जेड के उदाहरण (क्योंकि वे इंटरफेस कर रहे हैं)

इसके लिए कोई अतिरिक्त है नहीं बनाता हैं स्मृति आवंटन या जीसी (एबीसीडी के) के लिए ओवरहेड क्योंकि ई के उदाहरण को 1 ब्लॉक के रूप में आवंटित किया गया है। कोई भी रनटाइम ओवरहेड पूरी तरह से शामिल रचनाकारों पर निर्भर करेगा।

हमेशा रचनाकारों की एक श्रृंखला (ई से ए) निष्पादित की जा रही है, संभवतः डिफ़ॉल्ट कन्स्ट्रक्टर, लेकिन 1 स्तर पर एकाधिक कन्स्ट्रक्टर को कॉल करना भी संभव है।

+0

क्षमा करें, लेकिन विरासत द्वारा बनाए गए कोई भी उदाहरण नहीं हैं! – AxelEckenberger

+0

@ ओबेलिक्स, एम्बेडेड के आसपास उद्धरण नोट करें। लेकिन हाँ, आखिर में केवल 1 उदाहरण शामिल है। –

+0

धन्यवाद हेनक, इसलिए उस मामले में, उदाहरण के लिए यदि आप इन कक्षाओं को बिना किसी विरासत के एक वर्ग में विलय करना चाहते हैं, तो क्या वे स्मृति, जीसी और रनटाइम प्रदर्शन के मामले में काफी समान होंगे? –

2

विरासत टाइप करें और उदाहरण नहीं बनाते हैं। आपके पास ई का एक उदाहरण है जिसमें ए, बी, सी, डी और ई द्वारा परिभाषित डेटा शामिल है। यह इन वर्गों और इंटरफेस एक्स, वाई, और जेड

7

द्वारा परिभाषित विधियों और संपत्ति एक्सेसर्स प्रदान करता है एक वस्तु - ई का एक उदाहरण - लेकिन इसमें वर्ग पदानुक्रम में घोषित सभी फ़ील्ड शामिल होंगे। (इंटरफेस फ़ील्ड घोषित नहीं कर सकते हैं, इसलिए वे ऑब्जेक्ट के भीतर डेटा के लिए अप्रासंगिक हैं।) यह केवल फ़ील्ड (और लेआउट को प्रभावित करने वाले किसी भी विशेषता, स्वीकार्य रूप से) है जो किसी ऑब्जेक्ट द्वारा ली गई मेमोरी में योगदान देता है।

ई के उदाहरण का संदर्भ टाइप ए, बी, सी, डी, एक्स, वाई या जेड के संदर्भ में एक पहचान-संरक्षण संदर्भ रूपांतरण के रूप में "रूपांतरित" किया जा सकता है - यानी यह अभी भी एक संदर्भ होगा एक ही वस्तु

+0

धन्यवाद जॉन। जब आप उपर्युक्त में से किसी एक में ई को परिवर्तित करते हैं, तो क्या यह एक नया उदाहरण बनायेगा? मुझे लगता है कि यह आधार वर्गों के लिए करता है, है ना? लेकिन इंटरफेस के लिए? –

+0

उदाहरण के लिए यदि आप इन कक्षाओं को बिना किसी विरासत के एक वर्ग में विलय करना चाहते हैं, तो क्या वे स्मृति, जीसी और रनटाइम प्रदर्शन के मामले में काफी समान होंगे? –

+1

@ जोन: आप ई के उदाहरण को परिवर्तित नहीं करते हैं, केवल एक उदाहरण का संदर्भ 'रूपांतरित' है, जो बहुत सस्ता है। –

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