2013-02-18 50 views
2

我試圖將多個通用接口作爲參數傳遞給我的某個類的構造函數。將多個通用接口傳遞給方法

下面的代碼無法編譯:

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

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

我有一百個不同類型的海報發電機。它們都從IPosterGenerator接口繼承。當我實例化一個新的插件板時,我需要將三個IPosterGenerator傳遞給插件板的構造函數。但是,這三種IPosterGenerators都是不同類型的。這就是爲什麼我想出了這個愚蠢的A,B和C.

這可以完成嗎?

+0

您是說A,B和C類只存在,以便您可以將三個IPosterGenerator參數傳遞給構造函數? – Maciej 2013-02-18 17:30:11

+0

否否。我有大約一百個班級(如A,B和C)。 – Ingmar 2013-02-18 17:34:29

回答

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); 
+0

哦,好的。但是如果我需要一個帶有4個發生器的構造函數呢?或者可能是一整套發電機?對不起,我還不夠精確...... – Ingmar 2013-02-18 17:33:21

+0

@IngmarBode那麼,除非他們具有相同的類型或[有用的]通用基本類型,否則他們將無法全部處於集合中。 – Servy 2013-02-18 17:38:57

+0

好吧,明白了。感謝你們所有人。這很快:-) – Ingmar 2013-02-18 17:41:49

1

你必須讓你的類聲明爲A,B & C。這樣的事情:

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

對不起,因爲我的原始問題不夠精確。以下是我認爲是好的,我(和我需要足夠的靈活性):再次

public interface IPosterGenerator 
{ 
} 

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

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

    } 
} 

感謝您的支持,夥計們!

+0

好吧,不。我錯了。不適合我。我建立了一個全新的問題:http://stackoverflow.com/questions/14962110/use-a-list-of-generic-interfaces – Ingmar 2013-02-19 16:15:57