如何在调用方传递基类并接受派生的方法

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

我有一个返回基类响应的服务。可以肯定的是,它得到了响应。

    public class ResponseBase
    {
        public string Response { get; set; }
    }

    public class DerivedResponse : ResponseBase
    {
        public string AdditionalResponse { get; set; }
    }

这里是服务代码:

public class SomeService
{
    public ResponseBase GetResponse() => new DerivedResponse();
}

然后,我需要以不同的方式处理不同的响应。显然,如果不是一个好的解决方案,请尝试通过100500获得适当的行为。而且,我决定为每个具体响应设置一个特殊的响应处理程序。

    public interface IHandlerBase<T>
        where T : ResponseBase
    {
        void Handle(T response);
    }

    public class DerivedResponseHandler : IHandlerBase<DerivedResponse>
    {
        public void Handle(DerivedResponse response)
        {

        }
    }

此外,我们需要封装行为,该行为将决定要获取哪个处理程序以处理具体响应,我认为工厂的解决方案不是一个坏办法。我有一个问题,因为我不知道返回什么,因为我不知道编译时派生的类型:

    public class HandlerFactory {
        public IHandlerBase<> /*WHAT RETURN HERE*/ CreateHandler(ResponseBase response)
        {
            //decide the derived type of the 'response' and return appropriate handler
        }
    }

确保我们可以删除通用参数,在所有处理程序中接受基类,然后在具体处理程序中将其转换为special,但我认为这不是一个好的解决方案。因此,您能否建议如何以一种干净的方式(可能是某些模式或解决方案)来做到这一点?

c# design-patterns architecture factory-pattern design
1个回答
0
投票

我们可以通过创建新的NotGeneric interface

    public interface IHandlerBase
    {
        void Handle(ResponseBase response);
    }

    public interface IHandlerBase<T> : IHandlerBase
        where T : ResponseBase
    {
        void Handle(T response);
    }

    public class DerivedResponseHandler : IHandlerBase<DerivedResponse>
    {
        public void Handle(DerivedResponse response)
        {

        }

        public void Handle(ResponseBase response)
        {
            var actualParameter = (DerivedResponse) response;
            Handle(actualParameter);
        }
    }

在那种情况下,派生处理程序中有2种方法:一种用于实际处理,另一种用于自适应(类似于适配器模式)。问题是还可以,也许有人有更好的解决方案。

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