使用泛型链接两个层次结构

时间:2014-02-05 17:44:06

标签: c# .net generics

我有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

2 个答案:

答案 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();
}