सी # में, जब आपसी # निर्माता निष्पादन आदेश
Class(Type param1, Type param2) : base(param1)
वर्ग के निर्माता पहले मार डाला, और फिर सुपर क्लास निर्माता कहा जाता है या यह पहली बार आधार निर्माता फोन करता है?
सी # में, जब आपसी # निर्माता निष्पादन आदेश
Class(Type param1, Type param2) : base(param1)
वर्ग के निर्माता पहले मार डाला, और फिर सुपर क्लास निर्माता कहा जाता है या यह पहली बार आधार निर्माता फोन करता है?
आदेश है (यदि वहाँ आधार पर एक है):
तो सबसे व्युत्पन्न वर्ग के साथ शुरू:
Foo() : this(...)
आदिनोट श्रृंखलित रहे जावा में, आधार वर्ग आरंभ नहीं हो जाता कि से पहले चर initializers चलाए जा रहे हैं वहाँ हो सकता है। यदि आपने कभी भी कोई कोड पोर्ट किया है, तो यह जानने के लिए एक महत्वपूर्ण अंतर है :)
यदि आपकी रुचि है तो मेरे पास page with more details है।
ऐसा लगता है कि मेरे योगदान का आधा हिस्सा यहां उनके उत्तरों की ओर इशारा कर रहे हैं; लेकिन एरिक लिपर्ट ने इस विषय पर पोस्ट की एक अच्छी जोड़ी भी लिखी: 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 –
संग्रह प्रारंभकर्ताओं के प्रभावों सहित, शायद प्रश्न की तुलना में गहराई में थोड़ा और, लेकिन एक अच्छा पढ़ा। जावा के साथ तुलना के लिए –
+1। साथ ही, मुझे लगता है कि सी ++ के मामले में है लेकिन मैं 100% निश्चित नहीं हूं। –
यह पहले बेस कन्स्ट्रक्टर को कॉल करेगा। यह भी ध्यान रखें कि यदि आप अपने कन्स्ट्रक्टर के बाद :base(param1)
नहीं डालते हैं, तो बेस के खाली कन्स्ट्रक्टर को कॉल किया जाएगा।
बेसक्लास के निर्माता को पहले कहा जाता है।
आपका प्रश्न थोड़ा स्पष्ट नहीं है, लेकिन मैं आप निम्नलिखित
का उपयोग कर बनाम मेरी XNA वस्तु के लिए आधार निर्माता फोन का मतलब यह सोचते कर रहा हूँपूछने के लिए जब मैं impilict डिफ़ॉल्ट निर्माता
इसका उत्तर आपके परिदृश्य और अंतर्निहित वस्तु दोनों पर अत्यधिक निर्भर है। आप थोड़ा बुद्धि निम्नलिखित
TerrainCollision
के आधार वस्तु के प्रकार क्या है स्पष्ट कर सकता है?मेरा सबसे अच्छा जवाब यह है कि यदि आपके पास बेस क्लास के कन्स्ट्रक्टर के पैरामीटर के साथ लाइन पैरामीटर हैं, तो आपको लगभग निश्चित रूप से इसे कॉल करना चाहिए।
[संपादित करें: उस समय मुझे जवाब देने के लिए, सवाल पूरी तरह से बदल गया था]।
उत्तर यह है कि यह पहले आधार पर कॉल करता है।
आप "आधार" निर्माता कॉल की बिट करना होगा पूछ रहे हैं [नीचे पुराने सवाल का मूल जवाब]?
यदि हां, तो आप "श्रृंखला" निर्माता आधार के लिए एक कॉल वर्ग एक और वर्ग है जो इस निर्माता है से ली गई है, तो होगा:
public class CollisionBase
{
public CollisionBase(Body body, GameObject entity)
{
}
}
public class TerrainCollision : CollisionBase
{
public TerrainCollision(Body body, GameObject entity)
: base(body, entity)
{
}
}
इस उदाहरण में, TerrainCollision
CollisionBase
से निकला है।इस तरह से कंस्ट्रक्टर्स चेनिंग करके, यह निर्दिष्ट निर्माता आपूर्ति मानकों के साथ आधार वर्ग पर कहा जाता है, बल्कि डिफ़ॉल्ट निर्माता से सुनिश्चित करता है
कन्स्ट्रक्टर तंत्र बहुत बेहतर है क्योंकि यह कन्स्ट्रक्टर चेनिंग का उपयोग करने के लिए एप्लिकेशन को छोड़ देता है और यदि आप एप्लिकेशन का विस्तार करना चाहते हैं तो यह विरासत के माध्यम से न्यूनतम कोड परिवर्तन करने की क्षमता को सक्षम बनाता है। Jon Skeets Article
सुनिश्चित नहीं हैं कि अगर यह एक टिप्पणी/उत्तर होना चाहिए लेकिन जो लोग उदाहरण से सीख के लिए इस बेला आदेश को दिखाता है और साथ ही: 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
मैंने कभी भी XNA का उपयोग नहीं किया, लेकिन मैं आपके प्रश्न में एक प्रश्न देखने में विफल रहा हूं ... प्रश्न। –
क्या यह है? क्या आप सब हमें जाने के लिए दे रहे हैं? चलो, हमें एक सुराग दें ... पशु, vegtable, खनिज? –
मैंने बटन को बहुत तेजी से एक्सडी धक्का दिया ... क्षमा करें, मैं अभी भी लिख रहा था ... – webdreamer