[英]C# Method in base class that returns derived type
我正在嘗試在基類中創建一個能夠返回派生類型的方法。 它沒有必要實際駐留在基類中,但我不想在所有派生類中實現該方法。
像這樣的東西。
public class Error
{
protected Error() { }
public string Message { get; protected set; }
public static Error Because(string msg)
{
return new Error() { Message = msg };
}
}
然后我創建了兩個派生類型:
public class MyError : Error
public class OtherError : Error
我可以用Because
實例化而無需任何進一步的實現。
我知道我可以執行這樣的實現:
public static T Because<T>(string message)
where T : Error
{
var error = default(T);
error.Message = message;
return error;
}
但是我必須指定類型參數:
MyError err = Error.Because<MyError>("My error");
或者
MyError simp = MyError.Because<MyError>("My error");
我希望能夠用這樣的東西來調用它:
MyError myError = MyError.Because("Something went wrong");
OtherError myError = OtherError.Because("Something else went wrong");
看起來像一個Curiously recurring 模板模式適合這里。
喜歡:
public abstract class Error<ConcreteError>
where ConcreteError : Error<ConcreteError>, new()
{
protected Error() { }
public string Message { get; protected set; }
public static ConcreteError Because(string msg)
{
return new ConcreteError() { Message = msg };
}
}
public class MyError : Error<MyError> { }
public class OtherError : Error<OtherError> { }
static void Main(string[] args)
{
MyError myError = MyError.Because("Something went wrong");
OtherError myError2 = OtherError.Because("Something else went wrong");
}
您所描述的功能是返回類型協方差,它是一種被接受和支持的語言功能,將在 C# 語言的下一個版本之一中實現。 目前計划為 C# 9.0 發布。
有關更多詳細信息,請查看相應的dotnet/csharplang
討論線程:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.