2009-12-10 17 views
87

सी # में, जब आपसी # निर्माता निष्पादन आदेश

Class(Type param1, Type param2) : base(param1) 

वर्ग के निर्माता पहले मार डाला, और फिर सुपर क्लास निर्माता कहा जाता है या यह पहली बार आधार निर्माता फोन करता है?

+1

मैंने कभी भी XNA का उपयोग नहीं किया, लेकिन मैं आपके प्रश्न में एक प्रश्न देखने में विफल रहा हूं ... प्रश्न। –

+4

क्या यह है? क्या आप सब हमें जाने के लिए दे रहे हैं? चलो, हमें एक सुराग दें ... पशु, vegtable, खनिज? –

+1

मैंने बटन को बहुत तेजी से एक्सडी धक्का दिया ... क्षमा करें, मैं अभी भी लिख रहा था ... – webdreamer

उत्तर

124

आदेश है (यदि वहाँ आधार पर एक है):

  • सदस्य चर पदानुक्रम में सभी वर्गों के लिए डिफ़ॉल्ट मानों के लिए प्रारंभ कर रहे हैं

तो सबसे व्युत्पन्न वर्ग के साथ शुरू:

  • चर initializers सबसे व्युत्पन्न प्रकार के लिए क्रियान्वित कर रहे हैं
  • निर्माता श्रृंखलन बाहर काम करता है जो आधार वर्ग निर्माता
  • इस :)
  • में निर्माता निकायों के सभी के नाम से जाना आधार वर्ग आरंभ नहीं हो जाता (recurse जा रहा है इस वर्ग में श्रृंखला क्रियान्वित कर रहे हैं (ध्यान दें एक से अधिक अगर वे साथ Foo() : this(...) आदि

नोट श्रृंखलित रहे जावा में, आधार वर्ग आरंभ नहीं हो जाता कि से पहले चर initializers चलाए जा रहे हैं वहाँ हो सकता है। यदि आपने कभी भी कोई कोड पोर्ट किया है, तो यह जानने के लिए एक महत्वपूर्ण अंतर है :)

यदि आपकी रुचि है तो मेरे पास page with more details है।

+4

ऐसा लगता है कि मेरे योगदान का आधा हिस्सा यहां उनके उत्तरों की ओर इशारा कर रहे हैं; लेकिन एरिक लिपर्ट ने इस विषय पर पोस्ट की एक अच्छी जोड़ी भी लिखी: http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite- ऑर्डर-ए-कन्स्ट्रक्टर-पार्ट-वन.एएसपी http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as- कन्स्ट्रक्टर-भाग-दो.aspx –

+0

संग्रह प्रारंभकर्ताओं के प्रभावों सहित, शायद प्रश्न की तुलना में गहराई में थोड़ा और, लेकिन एक अच्छा पढ़ा। जावा के साथ तुलना के लिए –

+0

+1। साथ ही, मुझे लगता है कि सी ++ के मामले में है लेकिन मैं 100% निश्चित नहीं हूं। –

41

यह पहले बेस कन्स्ट्रक्टर को कॉल करेगा। यह भी ध्यान रखें कि यदि आप अपने कन्स्ट्रक्टर के बाद :base(param1) नहीं डालते हैं, तो बेस के खाली कन्स्ट्रक्टर को कॉल किया जाएगा।

10

बेसक्लास के निर्माता को पहले कहा जाता है।

0

आपका प्रश्न थोड़ा स्पष्ट नहीं है, लेकिन मैं आप निम्नलिखित

पूछने के लिए जब मैं impilict डिफ़ॉल्ट निर्माता

का उपयोग कर बनाम मेरी XNA वस्तु के लिए आधार निर्माता फोन का मतलब यह सोचते कर रहा हूँ

इसका उत्तर आपके परिदृश्य और अंतर्निहित वस्तु दोनों पर अत्यधिक निर्भर है। आप थोड़ा बुद्धि निम्नलिखित

  • क्या परिदृश्य
  • TerrainCollision के आधार वस्तु के प्रकार क्या है स्पष्ट कर सकता है?

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

1

[संपादित करें: उस समय मुझे जवाब देने के लिए, सवाल पूरी तरह से बदल गया था]।

उत्तर यह है कि यह पहले आधार पर कॉल करता है।

आप "आधार" निर्माता कॉल की बिट करना होगा पूछ रहे हैं [नीचे पुराने सवाल का मूल जवाब]?

यदि हां, तो आप "श्रृंखला" निर्माता आधार के लिए एक कॉल वर्ग एक और वर्ग है जो इस निर्माता है से ली गई है, तो होगा:

public class CollisionBase 
    { 
     public CollisionBase(Body body, GameObject entity) 
     { 

     } 
    } 

    public class TerrainCollision : CollisionBase 
    { 
     public TerrainCollision(Body body, GameObject entity) 
      : base(body, entity) 
     { 

     } 
    } 

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

0

कन्स्ट्रक्टर तंत्र बहुत बेहतर है क्योंकि यह कन्स्ट्रक्टर चेनिंग का उपयोग करने के लिए एप्लिकेशन को छोड़ देता है और यदि आप एप्लिकेशन का विस्तार करना चाहते हैं तो यह विरासत के माध्यम से न्यूनतम कोड परिवर्तन करने की क्षमता को सक्षम बनाता है। Jon Skeets Article

6

सुनिश्चित नहीं हैं कि अगर यह एक टिप्पणी/उत्तर होना चाहिए लेकिन जो लोग उदाहरण से सीख के लिए इस बेला आदेश को दिखाता है और साथ ही: https://dotnetfiddle.net/kETPKP

using System; 

// order is approximately 
/* 
    1) most derived initializers first. 
    2) most base constructors first (or top-level in constructor-stack first.) 
*/ 
public class Program 
{ 
    public static void Main() 
    { 
     var d = new D(); 
    } 
} 

public class A 
{ 
    public readonly C ac = new C("A"); 

    public A() 
    { 
     Console.WriteLine("A"); 
    } 
    public A(string x) : this() 
    { 
     Console.WriteLine("A got " + x); 
    } 
} 

public class B : A 
{ 
    public readonly C bc = new C("B"); 

    public B(): base() 
    { 
     Console.WriteLine("B"); 
    } 
    public B(string x): base(x) 
    { 
     Console.WriteLine("B got " + x); 
    } 
} 

public class D : B 
{ 
    public readonly C dc = new C("D"); 

    public D(): this("ha") 
    { 
     Console.WriteLine("D"); 
    } 
    public D(string x) : base(x) 
    { 
     Console.WriteLine("D got " + x); 
    } 
} 

public class C 
{ 
    public C(string caller) 
    { 
     Console.WriteLine(caller + "'s C."); 
    } 
} 

परिणाम:

D's C. 
B's C. 
A's C. 
A 
A got ha 
B got ha 
D got ha 
D 
संबंधित मुद्दे