【发布时间】:2017-05-30 15:29:11
【问题描述】:
我们最近在我们的数据收集程序中偶然发现了一个问题。我们使用通用接口来拥有一个通用的工作流程,该工作流程可以通过配置中的具体实现轻松针对不同的数据输入进行定制。最近对丢失数据错误的修复大致如下所示:
[TestFixture]
internal class GenericsTest
{
[Test]
public void Config()
{
new Collector(new Search());
}
internal class Collector
{
public Collector(Clues<Where, What> foo)
{
}
}
internal interface Clues<T, P>
{
}
internal class Search : Clues<Where, Item>
{
}
internal class Where
{
}
internal class Item : What
{
}
internal interface What
{
}
}
配置正在使用特定搜索初始化特定收集器。收集器本身只需要一个带有具体类 Where 和接口 What 作为参数的通用接口。 Search 类应该通过实现具有 Where 类的通用 Clues 接口和自身实现 What 接口的 Item 类来满足这些期望。 相反,Search 的初始化失败,因为它无法在特定实现和一般期望之间建立联系。
Error CS1503 Argument 1: cannot convert from 'UnitTest.GenericsTest.GenericsTest.Search' to 'UnitTest.GenericsTest.GenericsTest.Clues<UnitTest.GenericsTest.GenericsTest.Where, UnitTest.GenericsTest.GenericsTest.What>'
我们尝试强制转换为所需的类型,但它只是将错误转移到运行时。
一般概念是,工作流尽可能保持通用,配置会处理所有特定要求。需要的具体方法应该在item类中引入,并隐藏在接口后面,避免不必要的混乱。
有没有特定的方法可以在 C# 中编写这样的实现?
【问题讨论】:
-
欢迎来到 SO!我从您的问题标题中删除了标签。请阅读here为什么。