Tôi có một tình huống mà tôi muốn ghi đè lên một phương thức của lớp cơ sở để thay đổi một chút kiểu trả về của phương thức. Bằng cách thay đổi một chút tôi có nghĩa là trả về một đối tượng được thừa kế từ đối tượng mà có thể đã được trả lại theo phương pháp trong các loại hình cơ sở ... trên thực tế, một mã số ít sẽ làm cho dễ dàng hơn này ...Phương pháp ghi đè để thay đổi kiểu trả về
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";
}
}
Vấn đề tôi có là trường hợp của obj2 không gọi nó là phiên bản của GetExternalObject() nhưng thay vì sử dụng thực hiện của cha mẹ nó.
Tôi nghĩ rằng nó đang làm như vậy bởi vì trong mã
var obj = GetExternalObject();
loại obj dự kiến sẽ được ExternalObject trong lớp cha mẹ. Tuy nhiên, tôi hiểu rằng C# không thể phân biệt giữa các phương thức dựa trên kiểu trả về.
Tôi biết có các giải pháp khác cho vấn đề như xác định IExternalObject để không bị quá tải về điều đó. Tất cả những gì tôi muốn biết là suy nghĩ là gì ngăn cản các lớp con GetExternalObject khỏi bị gọi ngay cả bởi chính lớp con?
Hoặc tôi có đang làm điều gì đó hoàn toàn không? :-)
tương tự câu hỏi: [C#: kiểu trả về Overriding] (http://stackoverflow.com/questions/1048884/c-overriding-return-types) –
có thể trùng lặp của [C#: kiểu trả về Overriding] (https : //stackoverflow.com/questions/1048884/c-overriding-return-types) –