कोई भी विधि अधिभार योग्य हो सकती है (= virtual
) या नहीं।
class Person
{
// this one is not overridable (not virtual)
public String GetPersonType()
{
return "person";
}
// this one is overridable (virtual)
public virtual String GetName()
{
return "generic name";
}
}
अब आप उन तरीकों कि overridable हैं ओवरराइड कर सकते हैं: निर्णय एक है जो विधि को परिभाषित करता है द्वारा किया जाता है
class Friend : Person
{
public Friend() : this("generic name") { }
public Friend(String name)
{
this._name = name;
}
// override Person.GetName:
public override String GetName()
{
return _name;
}
}
लेकिन क्योंकि यह आभासी नहीं है आप GetPersonType
विधि ओवरराइड नहीं कर सकते।
के उन वर्गों के दो उदाहरणों बनाएँ:
Person person = new Person();
Friend friend = new Friend("Onotole");
गैर आभासी विधि GetPersonType
Fiend
उदाहरण से बुलाया यह वास्तव में Person.GetPersonType
कि कहा जाता है जाता है:
Console.WriteLine(friend.GetPersonType()); // "person"
जब आभासी विधि GetName
कहा जाता है Friend
उदाहरण के अनुसार यह Friend.GetName
है जिसे कहा जाता है:
Console.WriteLine(friend.GetName()); // "Onotole"
आभासी विधि GetName
Person
उदाहरण यह Person.GetName
है कि कहा जाता है के द्वारा कहा जाता है जब:
Console.WriteLine(person.GetName()); // "generic name"
जब गैर आभासी विधि कहा जाता है विधि शरीर को देखा नहीं है - संकलक पहले से ही वास्तविक विधि की जरूरत है जानता है कहा जा सकता है। जबकि वर्चुअल विधियों के संकलक के साथ यह सुनिश्चित नहीं किया जा सकता कि कौन सी कॉल करनी है, और क्लास पदानुक्रम में इसे रनटाइम पर देखा जाता है, जिस प्रकार से विधि को कॉल किया जाता है: friend.GetName
के लिए यह Friend
से शुरू होता है कक्षा और इसे तुरंत पाता है, person.GetName
कक्षा के लिए यह Person
पर शुरू होता है और इसे वहां पाता है।
कभी कभी तुम एक उपवर्ग बनाने के लिए, एक आभासी विधि ओवरराइड और आप किसी भी अधिक ओवरराइड नीचे नहीं करना चाहती पदानुक्रम में - आपको लगता है कि के लिए sealed override
का उपयोग करें (कह आप पिछले एक है जो विधि को ओवरराइड करता हैं):
class Mike : Friend
{
public sealed override String GetName()
{
return "Mike";
}
}
लेकिन कभी कभी अपने दोस्त माइक ऐलिस के लिए अपने लिंग और इस तरह उसका नाम परिवर्तित करने का निर्णय :) आप या तो मूल कोड बदलने के लिए या बजाय उपवर्ग सकता माइक:
class Alice : Mike
{
public new String GetName()
{
return "Alice";
}
}
यहाँ आप एक ही नाम के साथ एक पूरी तरह से अलग विधि बनाने (अब तुम दो है)। कौन सी विधि और कब कहा जाता है? यह कैसे आप इसे कहते पर निर्भर करता है:
Alice alice = new Alice();
Console.WriteLine(alice.GetName()); // the new method is called, printing "Alice"
Console.WriteLine(((Mike)alice).GetName()); // the method hidden by new is called, printing "Mike"
जब आप इसे Alice
से फोन के परिप्रेक्ष्य आप Alice.GetName
कहते हैं, जब Mike
से की - आप Mike.GetName
कहते हैं। कोई रनटाइम लुकअप यहां नहीं बनाया गया है - क्योंकि दोनों विधियां गैर-वर्चुअल हैं।
आप हमेशा new
विधियों को बना सकते हैं - चाहे आप छिपा रहे तरीके आभासी हैं या नहीं।
यह गुणों और घटनाओं पर भी लागू होता है - उन्हें नीचे विधियों के रूप में दर्शाया जाता है।
इनपुट के लिए धन्यवाद .. लेकिन एक बात मेरे दिमाग में नहीं आती है .. बेस बी = नया व्युत्पन्न() का उपयोग क्या है? क्या यह आधार वर्ग या व्युत्पन्न वर्ग का निर्माण वस्तु है ?? –
व्युत्पन्न कक्षा। मुझे लगता है कि आपको बहुरूपता के बारे में और अधिक देखना है। आपके पढ़ने के लिए यहां एक अच्छा है। http://msdn.microsoft।com/en-us/library/ms173152 (v = vs.80) .aspx – CharithJ
@Xor: उस स्थिति में, आप 'व्युत्पन्न' ऑब्जेक्ट का उदाहरण बना रहे हैं और संदर्भ को 'बेस' चर में संग्रहीत कर रहे हैं। यह मान्य है क्योंकि एक 'व्युत्पन्न' वस्तु-एक 'बेस' ऑब्जेक्ट भी है। ऐसा कहने की तरह है कि हमें "व्यक्ति" की ज़रूरत है ताकि हमें "जॉनी" मिल जाए जो एक व्यक्ति बनता है। यहाँ वही सौदा। –