首页 > 解决方案 > 当其中一种实现需要更多数据时该怎么办

问题描述

我在想什么是处理这种情况的正确方法:我有一个 IService 接口,如下所示:

class Configuration
{
    public int Min { get; set; } 
    public int Max { get; set; }     
}

interface IService
{
    int Calculate(int userId, Configuration configuration)
}

比方说,我有 5 个实现此接口的类,它们运行良好。有一天我必须实施第 6 项服务,但这一项有点不同。为了完成它的工作,一个新的服务需要这样的配置:

class ExtendedConfiguration : Configuration
{
    public string Filter { get; set; }     
}

我的新服务可能如下所示:

class NewService : IService
{
    public int Calculate(int userId, Configuration configuration)
    {
        var extendedConfig = configuration as ExtendedConfiguration;
        //Calculating and returning result using extendedConfig...
    }
}

好像还好,服务可以。但是,我不喜欢这样的事实,即 Calculate 方法签名需要 Configuration 对象,而实际上需要 ExtendedConfiguration - 否则它将无法进行计算(并且会抛出异常)。

有没有更好的方法来编写这段代码?

标签: c#oopinterface

解决方案


计算方法签名需要配置对象,而实际上需要扩展配置

如前所述,您可以针对限制问题的通用解决方案。使用泛型参数定义接口并将其约束为 type Configuration

interface IService<T> where T : Configuration
{
    int Calculate(int userId, T configuration)
}

那么您的旧服务可能看起来仍然像以前一样:

class OldService : IService<Configuration>
{
    public int Calculate(int userId, Configuration configuration)
    {       
        return (configuration.Min + configuration.Max) * 2;
    }
}

并且在NewService您可以指定输入参数必须是类型ExtendedConfiguration

class NewService : IService<ExtendedConfiguration>
{
    public int Calculate(int userId, ExtendedConfiguration configuration)
    {
        string accessHereTheExtendedVersion = configuration.Filter;
        return (configuration.Min + configuration.Max) / 2;
    }
}

这并不是您确切问题的答案:

有没有更好的方法来编写这段代码?

但它是如何解决这个问题的不同方法。无论它是否适合您的环境和情况,您都必须对其进行测试。


推荐阅读