我有一个基本的抽象类,可以接受来自抽象类的类型,并且我正在摸索试图解决如何正确实现这一点。

基类:

public abstract class ApiService<TRequest, TResponse>
    where TRequest : ApiRequest
    where TResponse : ApiResponse
{
    public abstract TResponse Execute(TRequest Request);
}


ApiRequest类:

public abstract class ApiRequest
{

}


ApiResponse类:

public abstract class ApiResponse
{
    public bool Succeeded { get; set; }

}


我创建了一个TestService类来尝试解决这个问题,但是这些概念对我来说并没有在一起:

public class TestService : ApiService<ApiRequest, ApiResponse>
{
    public override ApiResponse Execute(ApiRequest Request)
    {
        ApiResponse response;

        return (response);
    }


您能提供的任何帮助将不胜感激,并帮助我进一步理解抽象类!谢谢!

所以我的问题是:我不知道如何在Execute方法中实现ApiResponse,因为您无法实例化抽象类。

最佳答案

泛型和多态化很好,但是必须在某个时候停止。在您的情况下,您具有良好的API接口,很明显,您可以传递TRequest并收到TResponse

您应该添加的是如何治疗特定病例。添加一层IRequestHander<TRequest,TResult>,它将知道如何从特定的Result创建特定的Request

然后使用Factory设计模式,您的API函数将调用工厂以获取适合其请求的特定处理程序。它将执行RequestHander并返回从中获得的Response

public class SpecificRequestA : ApiRequest {}
public class SpecificResponseA : ApiResponse{}

public interface IRequestHander<TRequest,TResponse>
    where TRequest : ApiRequest
    where TResponse : ApiResponse
{
    TResponse Exeute(TRequest request);
}

public class SpecificRequestHandlerA : IRequestHander<SpecificRequestA,SpecificResponseA>
{
    SpecificResponseA Execute(SpecificRequestA request)
    {
        //create the new response out of the given request. Here you know exactly on what you are working :)
    }
}


然后添加工厂。

还可以考虑将请求实现为Request<TResponse>-看看它是否更适合您的情况

我建议研究依赖注入和DI容器(例如Castle,Ninject,Unity,Simple Injector)以
负责初始化。

关于c# - 用抽象类型实现抽象类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40008602/

10-12 22:43