2012-03-06 17 views
13

संभव डुप्लिकेट:
C# keyword usage virtual+override vs. new
Difference between new and override?जब के बजाय ओवरराइड सी # नई उपयोग करने के लिए

तो मैं एक परियोजना पर काम कर रहा है और कुछ अंतर के बारे में पढ़ कर करने का निर्णय लिया सी # में new और override कीवर्ड के बीच।

मैंने जो देखा उससे, ऐसा लगता है कि new कीवर्ड कार्यक्षमता का उपयोग कोड में बग बनाने का एक शानदार तरीका है। इसके अलावा मैं वास्तव में नहीं देखता कि यह वास्तव में इसका उपयोग करने के लिए कब समझ में आता है।

किसी भी चीज़ से जिज्ञासा से अधिक, क्या कोई पैटर्न है जहां new कीवर्ड जाने का सही तरीका है?

+0

http://msdn.microsoft.com/en-us/library/ms173153(v=vs.80).aspx –

+1

आप देख सकते हैं मैं नहीं कह रहा था क्या दो कीवर्ड के बीच अंतर है।सवाल यह था कि एक आम पैटर्न है या नहीं, जहां आप जानबूझकर बेस क्लास सदस्यों को इस तरह से छिपाना चाहते हैं। – user472875

+3

@ रामहाउंड - अगर आप सचमुच सोचना बंद कर देते हैं तो यह पूरी तरह से समझ में आता है। अभिभावक वर्ग से विरासत में आने पर नए कीवर्ड का गलत उपयोग कई अनुचित रूप से उपयोग किए जाने पर कई बग का कारण बन सकता है (डेवलपर्स अक्सर इसे ओवरराइड करने के लिए एक विधि पर फेंक देते हैं लेकिन वर्चुअल नहीं है ... जो बहुत अप्रत्याशित व्यवहार की ओर जाता है)। –

उत्तर

7

new कीवर्ड जब आप मूल कार्यान्वयन को छिपाना चाहते हैं तो जाने का सही तरीका है और आपको परवाह नहीं है कि आप अपनी ऑब्जेक्ट को पॉलिमॉर्फिक रूप से इलाज करते समय अपनी विधि को कॉल नहीं कर पाएंगे।

मुझे स्पष्टीकरण दें। निम्नलिखित पर विचार करें:

public class Base 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("Base"); 
    } 
} 

public class Child : Base 
{ 
    public void new DoSomething() 
    { 
     Console.WriteLine("Child"); 
    } 
} 

समय-समय पर, यह बच्चे इसलिए new कीवर्ड के उपयोग में आधार वर्ग 'कार्यक्षमता को छिपाने के लिए फायदेमंद है।

Base instance = new Child(); 
instance.DoSomething(); // may expect "Child" but writes "Base" 
+0

यह सच नहीं है (कम से कम मैं इसे कैसे पढ़ रहा हूं)। यदि आधार विधि वर्चुअल चिह्नित है, तो आप इसे अभी भी 'नई' विधि से कॉल कर सकते हैं। क्या आपका मतलब कुछ और था? – Joe

+1

@ जो - क्या आप 'सार्वजनिक निर्माता' और 'सार्वजनिक विधि' के बीच का अंतर जानते हैं? ऐसा लगता है कि आप नए SomeObject (मूल्य) के बारे में बात नहीं कर रहे हैं, लेकिन किसी और चीज के बजाय। आपको वास्तव में स्पष्ट करना चाहिए कि आप किस बारे में बात कर रहे हैं। –

+1

@ जो - मेरा मतलब कुछ अलग था। मान लें कि आपके पास बेस नामक बेस क्लास है जिसे DoSomething नामक विधि के साथ कहा जाता है। आप बच्चे में बेस का उत्तराधिकारी हैं और नए कीवर्ड का उपयोग करके एक DoSomething विधि बनाते हैं। यदि आप निम्न कार्य करते हैं: 'आधार आधार = नया बच्चा(); आधार। कुछ ऐसा(); 'आप 'Child.DoSomething' की बजाय' बेस। कुछ 'को बुलाएंगे क्योंकि आपने बच्चे को ओवरराइड करने के बजाय बच्चे में मूल कार्यान्वयन छुपाया था। –

1

एक बात new आप देता है करने की क्षमता के रूप में यदि आप प्रदर्शित करने के: समस्या कुछ डेवलपर्स आँख बंद करके ऐसा करते हैं कि जो निम्नलिखित पक्ष प्रभाव (इसलिए 'बग' आप का उल्लेख) को बढ़ावा मिलेगा है को एक विधि को ओवरराइड कर सकते हैं जिसे वर्चुअल घोषित नहीं किया गया है। ध्यान रखें कि आप ओवरराइड नहीं कर रहे हैं, लेकिन वास्तव में एक ही नाम के साथ एक विधि घोषित कर रहे हैं।

override का उपयोग करने के लिए, विधि virtual या abstract के रूप में चिह्नित किया जाना है।

public class PolyTest 
{ 
    public void SomeMethod() 
    { 
     Console.WriteLine("Hello from base"); 
    } 
} 

public class PolyTestChild : PolyTest 
{ 
    new public void SomeMethod() 
    { 
     Console.WriteLine("Hello from child"); 
    } 
} 

, बग्गी कोड के बारे में अपनी टिप्पणी के बारे में आधार कार्यान्वयन कुछ है कि आप या फोन करने वाले की उम्मीद है कर रहा है, कि जहां बग है। हालांकि, मुझे यह नहीं लगता कि base.SomeMethod (जब ओवरराइडिंग) पर कॉल करने में विफल होने की तुलना में कोई और खतरनाक नहीं है और आपको इसकी आवश्यकता है।

+2

अपने शब्द के साथ सावधान रहें। नया आपको कभी भी कुछ ओवरराइड करने की अनुमति नहीं देता है। यह आपको आधार कार्यान्वयन को छिपाने की अनुमति देता है। –

+1

यह निश्चित रूप से एक ओवरराइड नहीं है; यह एक मानक है "व्युत्पन्न वर्ग पर एक नई विधि बनाएं जो कि बेस क्लास पर एक विधि के समान नाम हो।" यदि कोई विधि 'आभासी' या 'सार' चिह्नित नहीं है, तो आप इसे ओवरराइड नहीं कर सकते हैं। 'ओवरराइड' शब्द की शुद्ध अर्थ में – dlev

+0

आप सही हैं, लेकिन ओपी पूछ रहा था कि अंतर क्या है। मैं सही शब्दावली में संपादित करूंगा – Joe

0

new इसकी जगह है और इसे केवल पर सही बग्गी कोड पर जाने का शानदार तरीका माना जाता है यदि आपको यह नहीं पता कि इसका उपयोग कैसे किया जाए।

एक उदाहरण:

public class A 
{ 
    public void AMethod() { } 
} 

public class B : A 
{ 
    public override void AMethod() { } 
} 

इस स्थिति AMethod में B द्वारा ओवरराइड नहीं किया जा सकता क्योंकि यह, virtual या abstract नहीं है तो आपको एक कस्टम कार्यान्वयन आप चाहिए उपयोग new प्रदान करने के लिए।

+0

न तो ओवरराइड का उपयोग करके न ही नया नया उपयोग करने के समान परिणाम देगा, सिवाय इसके कि आपको संकलन समय पर चेतावनी मिलेगी। – rlesias

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