c# - 当其中一个实现需要更多数据时该怎么办

标签 c# oop interface

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

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

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

比方说,我有 5 个实现此接口(interface)的类,它们运行良好。 有一天我必须实现第 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 - 否则它将无法进行计算(并会抛出异常)。

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

最佳答案

that Calculate method signature requires Configuration object, while in reality ExtendedConfiguration is needed

如前所述,您可以针对限制问题寻求通用解决方案。使用通用参数定义接口(interface)并将其约束为 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;
    }
}

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

Is there a better way of writing this code?

但解决这个问题的方法不同。它是否适合您的上下文和情况,您必须对其进行测试。

关于c# - 当其中一个实现需要更多数据时该怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52160933/

相关文章:

java - Kotlin类实现Java接口(interface)报错

c# - 为什么只拿一个? Linq to XML C#

c# - 如何在 c# asp.net 中制作下载按钮?与查询?

c# - WCF 服务中跨 session 持续存在的静态变量

C# Azure上传文件错误指定的blob或 block 内容无效

java - 用户定义的包和类路径

java - 尝试只使用一个方法名称

python - 用什么来替换 python 中的接口(interface)/协议(protocol)

php - PHP 类中的常量和 "static"关键字

java - 接口(interface)可以随着时间发展吗?