newऔर virtual/ के बीच अंतर है override।
आप कल्पना कर सकते हैं, कि एक वर्ग, जब तात्कालिक, बिंदुओं की एक तालिका से ज्यादा कुछ नहीं है, इसके तरीकों के वास्तविक कार्यान्वयन की ओर इशारा करता है। निम्न छवि को इस अच्छी तरह से कल्पना करनी चाहिए:

अब अलग-अलग तरीके हैं, एक विधि को परिभाषित किया जा सकता है। प्रत्येक भिन्न व्यवहार करता है जब इसका उपयोग वंशानुक्रम के साथ किया जाता है। मानक तरीका हमेशा चित्र के ऊपर की तरह काम करता है। यदि आप इस व्यवहार को बदलना चाहते हैं, तो आप अलग-अलग खोजशब्दों को अपनी विधि में संलग्न कर सकते हैं।
1. सार वर्ग
पहला वाला है abstract। abstractतरीके बस कहीं नहीं इंगित करते हैं:

यदि आपकी कक्षा में सार सदस्य हैं, तो इसे भी चिह्नित करने की आवश्यकता है abstract, अन्यथा कंपाइलर आपके आवेदन को संकलित नहीं करेगा। आप abstractकक्षाओं के उदाहरण नहीं बना सकते हैं, लेकिन आप उनसे विरासत में प्राप्त कर सकते हैं और अपनी विरासत वाली कक्षाओं के उदाहरण बना सकते हैं और बेस क्लास परिभाषा का उपयोग करके उन्हें एक्सेस कर सकते हैं। आपके उदाहरण में ऐसा दिखेगा:
public abstract class Person
{
public abstract void ShowInfo();
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a student!");
}
}
यदि कहा जाता है, ShowInfoतो कार्यान्वयन के आधार पर, व्यवहार भिन्न होता है:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a student!'
दोनों, Students और Teachers s हैं Person, लेकिन वे अलग व्यवहार करते हैं जब उन्हें अपने बारे में तुरंत जानकारी देने के लिए कहा जाता है। हालांकि, उन्हें अपनी जानकारी को संकेत देने के लिए पूछने का तरीका समान है: Personवर्ग इंटरफ़ेस का उपयोग करना ।
तो पर्दे के पीछे क्या होता है, जब आपको विरासत मिलती है Person? लागू ShowInfoकरते समय, पॉइंटर कहीं और इंगित नहीं कर रहा है, यह अब वास्तविक कार्यान्वयन की ओर इशारा करता है ! जब एक बनाने Studentउदाहरण है, यह की ओर इशारा करता Studentरों ShowInfo:

2. आभासी तरीके
दूसरा तरीका virtualविधियों का उपयोग करना है। व्यवहार समान है, सिवाय इसके कि आप अपने आधार वर्ग में एक वैकल्पिक डिफ़ॉल्ट कार्यान्वयन प्रदान कर रहे हैं । virtualसदस्यों के साथ कक्षाएं अलग हो सकती हैं, हालांकि विरासत में मिली कक्षाएं अलग-अलग कार्यान्वयन प्रदान कर सकती हैं। यहां बताया गया है कि आपके कोड को वास्तव में क्या काम करना चाहिए:
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am a person!");
}
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
मुख्य अंतर यह है कि, आधार सदस्य कहीं भी Person.ShowInfoइंगित नहीं कर रहा है। यह भी कारण है, आप क्यों Person(और इस तरह इसे abstractअब चिह्नित किए जाने की आवश्यकता नहीं है) के उदाहरण बना सकते हैं :

आपको ध्यान देना चाहिए, कि यह अब के लिए पहली छवि से अलग नहीं दिखता है। ऐसा इसलिए है क्योंकि virtualविधि " मानक तरीके " को लागू करने की ओर इशारा कर रही है । का उपयोग करते हुए virtual, आप बता सकते हैं Persons, कि वे कर सकते हैं (नहीं चाहिए ) के लिए एक अलग कार्यान्वयन प्रदान ShowInfo। यदि आप एक अलग कार्यान्वयन (उपयोग करते हुए override) प्रदान करते हैं , जैसा कि मैंने Teacherऊपर के लिए किया था , तो छवि उसी के लिए दिखाई देगी abstract। कल्पना कीजिए, हमने Students के लिए एक कस्टम कार्यान्वयन प्रदान नहीं किया :
public class Student : Person
{
}
कोड को इस तरह कहा जाएगा:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a person!'
और Studentइस तरह की छवि दिखाई देगी:

3. जादू `new` कीवर्ड उर्फ" शैडोइंग "
newइस के आसपास एक हैक अधिक है। आप सामान्यीकृत कक्षाओं में तरीके प्रदान कर सकते हैं, जिनका आधार वर्ग / इंटरफ़ेस में विधियों के समान नाम हैं। दोनों अपने स्वयं के, कस्टम कार्यान्वयन की ओर इशारा करते हैं:

कार्यान्वयन एक जैसा दिखता है, आपने प्रदान किया। आपके द्वारा विधि तक पहुँचने के तरीके के आधार पर व्यवहार भिन्न होता है:
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo(); // Prints 'I am a teacher!'
person.ShowInfo(); // Prints 'I am a person!'
यह व्यवहार चाहा जा सकता है, लेकिन आपके मामले में यह भ्रामक है।
मुझे आशा है कि यह चीजें आपके लिए समझने के लिए स्पष्ट बनाती हैं!