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!'
दोनों, Student
s और Teacher
s 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
। कल्पना कीजिए, हमने Student
s के लिए एक कस्टम कार्यान्वयन प्रदान नहीं किया :
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!'
यह व्यवहार चाहा जा सकता है, लेकिन आपके मामले में यह भ्रामक है।
मुझे आशा है कि यह चीजें आपके लिए समझने के लिए स्पष्ट बनाती हैं!