簡體   English   中英

基類中的 C# 方法返回派生類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM