我在想处理这种情况的正确方法是什么:我有一个如下所示的接口(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/