मेरे पास एक ऐसी स्थिति है जिसमें मैं बेस क्लास की विधि को ओवरराइड करना चाहता हूं ताकि विधि के रिटर्न प्रकार को थोड़ा बदल दिया जा सके। थोड़ा करके बदल मैं एक वस्तु है कि वस्तु है कि आधार प्रकार में विधि द्वारा लौटा दिए गए हैं से विरासत लौट मतलब ... वास्तव में, एक छोटे से कोड इस आसानवापसी प्रकार बदलने के लिए ओवरराइडिंग विधि
class Program
{
static void Main(string[] args)
{
var obj = new ParentClass();
Console.WriteLine("Parent says: " + obj.ShowYourHand());
var obj2 = new ChildClass();
Console.WriteLine("Child says: " + obj2.ShowYourHand());
Console.ReadLine();
}
}
public class ParentClass
{
public string ShowYourHand()
{
var obj = GetExternalObject();
return obj.ToString();
}
protected virtual ExternalObject GetExternalObject()
{
return new ExternalObject();
}
}
public class ChildClass : ParentClass
{
protected virtual new ExternalObjectStub GetExternalObject()
{
return new ExternalObjectStub();
}
}
public class ExternalObject
{
public override string ToString()
{
return "ExternalObject";
}
}
public class ExternalObjectStub : ExternalObject
{
public override string ToString()
{
return "ExternalObjectStub";
}
}
मुद्दा रहा होगा ... यह है कि obj2 का उदाहरण GetExternalObject() का संस्करण नहीं कहता है बल्कि इसके माता-पिता के कार्यान्वयन का उपयोग करता है।
मुझे लगता है कि इसकी वजह कोड
var obj = GetExternalObject();
obj के प्रकार के माता-पिता कक्षा में ExternalObject होने की उम्मीद है में ऐसा कर रही है। मुझे समझ में आया कि सी # वापसी प्रकार के आधार पर विधियों के बीच अंतर नहीं कर सकता है।
मुझे पता है कि इस मुद्दे के अन्य समाधान हैं जैसे कि IExternalObject को परिभाषित करना, इसलिए इसके बारे में भी लटका न लें। मैं बस इतना जानना चाहता था कि क्या सोच रहा है कि बाल वर्गों को GetExternalObject को बाल वर्ग द्वारा भी बुलाया जाने से रोकता है?
या क्या मैं पूरी तरह से कुछ कर रहा हूं? :-)
इसी प्रकार के प्रश्न: [सी #: अधिभावी वापसी प्रकार] (http://stackoverflow.com/questions/1048884/c-overriding-return-types) की [सी #: अधिभावी वापसी प्रकार] –
संभावित डुप्लिकेट (https : //stackoverflow.com/questions/1048884/c-overriding-return-types) –