c# - 当其中一种实现需要更多数据时该怎么办
问题描述
我在想什么是处理这种情况的正确方法:我有一个 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 - 否则它将无法进行计算(并且会抛出异常)。
有没有更好的方法来编写这段代码?
解决方案
计算方法签名需要配置对象,而实际上需要扩展配置
如前所述,您可以针对限制问题的通用解决方案。使用泛型参数定义接口并将其约束为 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;
}
}
这并不是您确切问题的答案:
有没有更好的方法来编写这段代码?
但它是如何解决这个问题的不同方法。无论它是否适合您的环境和情况,您都必须对其进行测试。
推荐阅读
- postgresql - 如何将值从表 A 复制到 B 并在 A 中插入对 B 的引用?
- angular - 无法将值分配给角度自动完成模型
- swift4 - 集合视图具有多个部分的不同单元格高度
- session - 管理员没有保存配置更改 magento 1.9
- python - 'MultiRNNCell' 对象不可迭代 Python Tensorflow
- xamarin.forms - Xamarin iOS MapBox 构建混乱
- c# - 标头中具有正确访问令牌的 API 调用给了我 401 未经授权
- android - 如何解决 MediaPlayer:错误 (1,-19)
- firebase - 如何导出带有自定义参数的 CSV 报告
- php - 在 Laravel 迁移期间获取 SQL 错误 20006