tl; dr -Child
ओवरParent
का उपयोग करनास्थानीय दायरे में बेहतर है। यह न केवल पठनीयता में मदद करता है, बल्कि यह सुनिश्चित करने के लिए भी आवश्यक है कि अतिभारित विधि संकल्प ठीक से काम करता है और कुशल संकलन को सक्षम करने में मदद करता है।
स्थानीय दायरे में,
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
वैचारिक रूप से, यह सबसे प्रकार की जानकारी को संभव बनाए रखने के बारे में है। यदि हम डाउनग्रेड करते हैं Parent
, तो हम अनिवार्य रूप से केवल टाइप जानकारी निकाल रहे हैं जो उपयोगी हो सकती थी।
पूर्ण प्रकार की जानकारी को पुनः प्राप्त करने के चार मुख्य लाभ हैं:
- संकलक को अधिक जानकारी प्रदान करता है।
- पाठक को अधिक जानकारी प्रदान करता है।
- क्लीनर, अधिक मानकीकृत कोड।
- प्रोग्राम लॉजिक को अधिक म्यूट करता है।
लाभ 1: संकलक को अधिक जानकारी
स्पष्ट प्रकार का उपयोग अतिभारित विधि संकल्प और अनुकूलन में किया जाता है।
उदाहरण: अतिभारित विधि संकल्प
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
उपरोक्त उदाहरण में, दोनों foo()
कॉल काम करते हैं , लेकिन एक मामले में, हम बेहतर अधिभार विधि संकल्प प्राप्त करते हैं।
उदाहरण: संकलक अनुकूलन
main()
{
Parent parent = new Child();
var x = parent.Foo();
Child child = new Child();
var y = child .Foo();
}
class Parent
{
virtual int Foo() { return 1; }
}
class Child : Parent
{
sealed override int Foo() { return 2; }
}
उपरोक्त उदाहरण में, दोनों .Foo()
कॉल अंततः उसी override
विधि को कहते हैं जो वापस आती है 2
। बस, पहले मामले में, सही विधि खोजने के लिए एक आभासी विधि लुकअप है; इस विधि के बाद से दूसरे मामले में इस वर्चुअल मेथड लुकअप की आवश्यकता नहीं है sealed
।
@Ben को श्रेय जिन्होंने अपने जवाब में एक समान उदाहरण दिया ।
फायदा 2: पाठक को अधिक जानकारी
सटीक प्रकार को जानना, अर्थात Child
, जो कोई भी कोड पढ़ रहा है, उसे अधिक जानकारी प्रदान करता है, जिससे यह देखना आसान हो जाता है कि कार्यक्रम क्या कर रहा है।
ज़रूर, शायद यह वास्तविक कोड से कोई फर्क नहीं पड़ता है parent.Foo();
और दोनों के बाद सेchild.Foo();
समझ में आता है, लेकिन किसी के लिए पहली बार कोड देखकर, अधिक जानकारी का सिर्फ सादा मददगार।
इसके अतिरिक्त, आपके विकास के वातावरण के आधार पर, IDE इससे अधिक उपयोगी टूलटिप और मेटाडेटा प्रदान करने में सक्षम हो सकता Child
हैParent
।
लाभ 3: क्लीनर, अधिक मानकीकृत कोड
अधिकांश C # कोड उदाहरण जिन्हें मैंने हाल ही में देखा है var
, जो मूल रूप से शॉर्टहैंड हैं Child
।
Parent obj = new Child(); // Sub-optimal
Child obj = new Child(); // Optimal, but anti-pattern syntax
var obj = new Child(); // Optimal, clean, patterned syntax "everyone" uses now
एक गैर- var
घोषणा बयान को देखने से सिर्फ यह दिखता है; अगर इसके लिए एक स्थितिजन्य कारण है, भयानक, लेकिन अन्यथा यह विरोधी पैटर्न दिखता है।
// Clean:
var foo1 = new Person();
var foo2 = new Job();
var foo3 = new Residence();
// Staggered:
Person foo1 = new Person();
Job foo2 = new Job();
Residence foo3 = new Residence();
लाभ 4: प्रोटोटाइपिंग के लिए अधिक परस्पर प्रोग्राम लॉजिक
पहले तीन फायदे बड़े वाले थे; यह बहुत अधिक स्थितिजन्य है।
फिर भी, जो लोग दूसरों की तरह कोड का उपयोग करते हैं, वे एक्सेल का उपयोग करते हैं, हम लगातार अपना कोड बदल रहे हैं। हो सकता है कि हमें कोड के इस संस्करण Child
में अद्वितीय तरीके से कॉल करने की आवश्यकता न हो, लेकिन हम बाद में कोड को फिर से तैयार कर सकते हैं या फिर से काम कर सकते हैं।
एक मजबूत प्रकार की प्रणाली का लाभ यह है कि यह हमारे कार्यक्रम तर्क के बारे में कुछ मेटा-डेटा प्रदान करता है, जिससे संभावनाएं अधिक आसानी से स्पष्ट हो जाती हैं। यह प्रोटोटाइप में अविश्वसनीय रूप से उपयोगी है, इसलिए जहां संभव हो, इसे रखना सबसे अच्छा है।
सारांश
Parent
ओवरलोड विधि विधि से गड़बड़ी का उपयोग करना , कुछ संकलक अनुकूलन को रोकता है, पाठक से जानकारी को हटाता है, और कोड को कुरूप बनाता है।
उपयोग करना var
वास्तव में जाने का मार्ग है। यह त्वरित, स्वच्छ, प्रतिरूपित है, और कंपाइलर और IDE को अपना काम ठीक से करने में मदद करता है।
महत्वपूर्ण : यह उत्तरएक विधि के स्थानीय दायरेमेंParent
बनाम केबारेChild
में है। Parent
बनामChild
कामुद्दावापसी के प्रकारों, तर्कों और वर्ग क्षेत्रों के लिए बहुत अलग है।