使父方法返回类型与其派生类类型匹配

问题描述 投票:0回答:1

我有一个这样的家长班:

public class WebserviceResultPerNode 
{
    public List<DBMappingResult> mapTable { get; set; }

    public static WebserviceResultPerNode newInstanceFromError(ErrorResponse error)
    {
        return new WebserviceResultPerNode
        {
            mapTable = null,
            responseCode = error.responseCode,
            responseMessage = error.responseMessage
        };
    }
}

它具有一些派生类,如下:

public class WebserviceInsertResultPerNode : WebserviceResultPerNode
{
}

现在,我想使派生类像WebserviceInsertResultPerNode,这样当我调用WebserviceInsertResultPerNode.newInstanceFromError()时,它们的返回类型与派生类相同,而不是父类。当前newInstanceFromError的返回类型是父类的类型,即WebserviceResultPerNode。我想知道有什么方法可以覆盖WebserviceInsertResultPerNode.newInstanceFromError,以便其返回类型为WebserviceInsertResultPerNode,但我不需要初始化父类的字段而无需重写它们。

我该如何重写代码以实现此目标?

c# oop inheritance derived-class
1个回答
2
投票

您可以通过使用反射简单地实现这一点,提供子类将始终具有无参数的构造函数:

public class WebserviceResultPerNode<T> where T : WebserviceResultPerNode<T>, new()
{
    public static T NewInstanceFromError(ErrorResponse error)
    {
        return new T() { … };
    };
}

然后,子孙类将如下所示:

public class MyWebServiceResult : WebserviceResultPerNode<MyWebServiceResult> { … }

但是,为了factory method,我强烈建议将separation of concerns分解为单独的工厂类。

© www.soinside.com 2019 - 2024. All rights reserved.