3

我正在尝试将多个通用接口作为参数传递给我的一个类的构造函数。

以下代码无法编译:

public interface IPosterGenerator<T>
{
    IQueryable<T> GetPosters();
}

public class Pinboard
{
    public Pinboard(IPosterGenerator<A> firstPosterGenerator, IPosterGenerator<B> secondPosterGenerator, IPosterGenerator<B> thirdPosterGenerator)
    { 
    }
}

我有大约一百种不同类型的海报生成器。它们都继承自 IPosterGenerator 接口。当我实例化一个新的 Pinboard 时,我需要将三个 IPosterGenerators 传递给 pinboard 的构造函数。但是,这三个 IPosterGenerator 中的每一个都将属于不同的类型。这就是为什么我想出了这个愚蠢的A、B和C。

这完全可以做到吗?

4

3 回答 3

6

听起来您可能想要Pinboard通用:

public class Pinboard<T1, T2, T3>
{
    public Pinboard(IPosterGenerator<T1> generator1,
                    IPosterGenerator<T2> generator2,
                    IPosterGenerator<T3> generator3)
    {
         ...
    }
}

为了更容易调用,您可以使用泛型方法创建一个非泛型类:

public static class Pinboard
{
    public static Pinboard<T1, T2, T3> Create(IPosterGenerator<T1> generator1,
                                              IPosterGenerator<T2> generator2,
                                              IPosterGenerator<T3> generator3)
    {
        return new Pinboard<T1, T2, T3>(generator1, generator2, generator3);
    }
}

然后,如果您已经有了生成器,则可以调用:

// Or whatever...
var board = Pinboard.Create(bigGenerator, smallGenerator, mediumGenerator);
于 2013-02-18T17:30:40.127 回答
1

您还必须将您的类声明为具有 A、B 和 C 的泛型。像这样的东西:

public class Pinboard<A,B,C> {
  public Pinboard(IPosterGenerator<A> firstPosterGenerator,
                  IPosterGenerator<B> secondPosterGenerator,
                  IPosterGenerator<C> thirdPosterGenerator) { 
  }
}
于 2013-02-18T17:32:37.593 回答
0

再次抱歉,我的原始问题不够精确。这是我发现对我来说没问题的(并且足够灵活以满足我的需要):

public interface IPosterGenerator
{
}

public interface IPosterGenerator<T> : IPosterGenerator
{
    IQueryable<T> GetPosters();
}

public class Pinboard
{
    public Pinboard(List<IPosterGenerator> generators) 
    {

    }
}

再次感谢大家的支持,伙计们!

于 2013-02-19T04:52:30.063 回答