泛型

2016-12-08 69 views
0

的陣列通用接口假設我們有以下接口:泛型

public interface ILine<T> 
{ 
    T Item { get; set;} 
} 

我有類Line1Line2實現它

public class Item1 
{ 
} 

public class Item2 
{ 
} 

public class Line1 : ILine<Item1> 
{ 
    public Item1 Item {get; set;} 
} 

public class Line2 : ILine<Item2> 
{ 
    public Item2 Item { get; set; } 
} 

現在我有一類

public class Lines1 
{ 
    public Line1[] Items { get; set;} 
} 

我想創建一個界面

public interface ILines<T> 
{ 
    ILine<T>[] Items { get; set;} 
} 

然後讓Lines1執行它Lines1 : ILines<Item1>(並且Lines2Item2的做法相同)。但這是不可能的,因爲編譯器錯誤

'Lines1'沒有實現接口成員'ILines.Items'。 'Lines1.Items'無法實現'ILines.Items',因爲它確實沒有匹配返回類型'IEnumerable>'的 。

的類都是從XML反序列化,所以我真的需要性能Item1Item2Line1Line2不是接口。 我能做些什麼來繼續前進?或者我正在嘗試應用一些着名的反模式?

更新:很好解釋,爲什麼它是不可能的: covariance in c#

不幸的是我沒有寫問題之前發現它。

回答

1

ILine<T>[]Line1[]不一樣。關於方差的概念,關於SO的答案很多,他們可以清楚地解釋這一點。

解決方案是確保類型實際上映射到彼此。這樣做的一個方法是使Line1通用參數,以及:

interface ILines<T, U> where U : ILine<T> 
{ 
    U[] Items { get; set; } 
} 

可悲的是,這意味着你失去了一些類型inferrence的,所以它可能意味着相當多的額外的文本。

0
You may want to check this out.  

    public class LinesOne : ILines<Item1> 
     { 
      public ILine<Item1>[] Lines 
      { 
       get 
       { 
        throw new NotImplementedException(); 
       } 

       set 
       { 
        throw new NotImplementedException(); 
       } 
      } 
     } 

     public class LinesTwo : ILines<Item2> 
     { 
      public ILine<Item2>[] Lines 
      { 
       get 
       { 
        throw new NotImplementedException(); 
       } 

       set 
       { 
        throw new NotImplementedException(); 
       } 
      } 
     } 
     public interface ILines<T> 
     { 

      ILine<T>[] Lines { get; set; } 
     } 

     public interface ILine<T> 
     { 
      T Item { get; set; } 
     } 

     public class Item1 
     { 
     } 

     public class Item2 
     { 
     } 

     public class Line1 : ILine<Item1> 
     { 
      public Item1 Item { get; set; } 
     } 

     public class Line2 : ILine<Item2> 
     { 
      public Item2 Item { get; set; } 
     } 
+0

這不是我想要實現的。你建議使用公共ILine []線,我需要公共Line1 [] Items {get;設置;}。創建對象的序列化程序知道Line1類是什麼,但無法創建接口的實例。 –