我有ISomething
个对象的层次结构,现在我正在尝试获取一个单独的对象来计算ISomething
个对象的参数。我期待一个很好的一对一映射。
public interface ISomething
{
void SetParameters(IParameters p);
}
public interface IParameterCalculator<TSomething> where TSomething : class, ISomething
{
IParameters Calculate();
}
我想让它更安全,例如确保给定计算器计算的参数仅适用于相关的对象。所以我尝试使参数通用:
public interface IParameterCalculator<TSomething> where TSomething : class, ISomething
{
IParameters<TSomething> Calculate();
}
我不确定如何在ISomething界面中使用它。在C++
中有标准的黑客用模板来实现这一点,C#
中有类似的技巧吗?或者其他任何想法如何以类型安全的方式将IParameterCalculator
层次结构链接到ISomething
?
答案 0 :(得分:2)
执行此操作的一种方法是使IParameters
也可以依赖ISomething
,并且您还必须将ISomething
声明为采用自我类型参数:
public interface ISomething<S> {
void SetParameters(IParameters<S> p);
}
public interface IParameterCalculator<TSomething> where TSomething : class, ISomething<TSomething> {
IParameters<TSomething> Calculate();
}
因此必须声明ISomething
将它们自己的类型传递给接口:
public class Something : ISomething<Something> {
...
}
请注意,这不会阻止像ISomething
这样的问题,而不会将自己声明为类型参数,并且您还必须将IParameters
更改为通用。所以你应该平衡额外的类型参数和他们的语义约束(自我类型)以及它们带给你的好处。
这在C ++中被称为奇怪的重复出现的模板模式......
答案 1 :(得分:1)
这是一个有趣的问题。
我相信以下内容应该有效:
public interface ISomething<TSomething>
{
void SetParameters(IParameters<TSomething> p);
}
public interface IParameterCalculator<TSomething>
where TSomething : class, ISomething<TSomething>
{
IParameters<TSomething> Calculate();
}