2012-10-04 52 views
1

是否可以定義一個接口,其中一個對象是另一個接口的列表?接口與對象列表<IAnotherInterface> - 這可能嗎?

我有兩個EF對象:

=====

class ImageType1 
{ 
    string Id 
    string Name 
    List<ImageType1Size> Sizes 
} 

class ImageType1Size 
{ 
    string Id 
    int Width 
    int Height 
} 

class ImageType2 
{ 
    string UserId 
    string ImageId 
    string Name 
    List<ImageType2Size> Sizes 
} 

class ImageType2Size 
{ 
    string UserId 
    string ImageId 
    int Width 
    int Height 
} 

=====

對於每個圖像大小類,所有屬性的是鍵(只是一個側面說明)。現在

,我想要做的就是創建以下兩個接口:

=====

interface IImage 
{ 
    string Name 
    List<ImageSize> Sizes 
} 

interface IImageSize 
{ 
    int Width 
    int Height 
} 

=====

在我的項目,我已經創建ImageType1,ImageType1Size,ImageType2和ImageType2Size的部分,每個使用相應的接口。

我在嘗試轉換ImageType1和ImageType2中的Sizes屬性以使用接口IImageSize時出現錯誤。

=====

這可能嗎?如果我不清楚,請讓我知道,我會重新提出這個問題。

謝謝!

+0

你可以發佈給你這個錯誤的確切的代碼行嗎?提供該答案後,將更容易闡明答案。 – deepee1

回答

2

你可能要考慮這裏的仿製藥:

interface IImage<TSize> where TSize : IImageSize 
{ 
    List<TSize> Sizes { get; } 
} 

class ImageType1 : IImage<ImageType1Size> 
{ 
    List<ImageType1Size> Sizes { get; private set; } 
} 

另外,這會工作:

interface IImage 
{ 
    IEnumerable<IImageSize> Sizes { get; } 
} 

class ImageType1 
{ 
    public List<ImageType1Size> SizeList { get; private set; } 

    public IEnumerable<IImageSize> Sizes { get { return SizeList; } } 
} 

這取決於什麼最適合怎麼樣你對數據進行操作。

+0

我已經結束了做選項2.謝謝! – kodikas

0

由於ImageType1類的簽名強制ImageType1.Sizes只包含ImageType1Size對象,因此不允許在ImageType1.Sizes內部存儲IImageSize,因爲這會允許將非ImageType1Size對象(例如ImageType2Size)添加到列表。

這意味着你不能在ImageType1.Sizes中存儲任何舊的IImageSize,這可能是你想要的。

,您仍然可以但是仍然使用ImageSize1和ImageSize2對象,就好像他們在做其它操作時,例如

void Test() 
{ 
    ImageType2 image = new ImageType2(); 
... 
    foreach(var size in image.Sizes) 
    { 
     if(IsTooBig(size)) 
     { 
      MessageBox.Show("I'm too big!")l 
     } 
    } 
} 

bool IsTooBig(IImageSize imagesize) 
{ 
    return imagesize.Width > 500; 
} 

現在你可以在兩個ImageType1Size和ImageType2Size對象使用IsTooBig是IImageSizes。

0

foreach (IImageSize iSize in list) { int iWid = iSize.Width; }

0

要建立在什麼default.kramer說,如果你明確需要IImage作爲一種類型的其他地方,你可以分割界面,如下所示:

interface IImage 
{ 
    string Name 
} 
interface IImage<TSize> : IImage where TSize : IImageSize 
{ 
    List<TSize> Sizes { get; } 
} 

class ImageType1 : IImage<ImageType1Size> 
{ 
    List<ImageType1Size> Sizes { get; private set; } 
} 

沒有這樣做,你也不可能有裸IImage無指定它的TSize。當然,如果你需要能夠訪問的非通用IImageSizes財產,你將需要添加一個擴展方法是這樣的:

static class IImageHelper 
{ 
    static List<IImageSize> GetSizes<TSize>(this IImage<TSize> image) where TSize: IImageSize 
    { 
    return image.Sizes.OfType<IImageSize>(); 
    } 
} 
0

不幸的是,這不能做。在推理時,考慮一下接口之外的問題很有幫助。

public void Example() 
{ 
    List<ImageType1Size> Sizes1 = new List<ImageType1Size>(); 
    List<ImageType2Size> Sizes2 = new List<ImageType2Size>(); 
    List<IImageSize> Sizes; 

    Sizes1 = Sizes; // These won't compile because the compiler can't guarantee that an 
    Sizes2 = Sizes; // IImageSize is an ImageType1Size. It could be an ImageType2Size 

    Sizes = Sizes1; // These will compile because the compiler knows that both 
    Sizes = Sizes2; // ImageType1Size and ImageType2Size are IImageSize's 
} 

現在您可以將其與您的課程進行比較。

class ImageType1 : IImageType 
{ 
    string Id {get; set;} 
    string Name {get; set;} 
    List<ImageType1Size> Sizes {get; set;} // This is just like Sizes1 = Sizes in the 
             // example above. 
} 

public void Test(IImageSize imageSize) 
{ 
    IImageType imageType = new ImageType1(); 

    imageType.Add(imageSize) // This would compile, as IImageType.Sizes will 
          // take any IImageSize 

    // But what really happens behind the interface is this: 
    ((ImageType1)imageType)Sizes.Add(imageSize);  

    // Trying to insert an IImageSize into the collection 
    // doesn't work, because the compiler can't guarantee that 
    // it's an ImageType1Size 
} 

注:我假設你的例子顯示

interface IImage 
{ 
    string Name 
    List<ImageSize> Sizes 
} 

實際上應該是

interface IImage 
{ 
    string Name 
    List<IImageSize> Sizes 
} 

正如你所沒有提到的類型 「IMAGESIZE」 在別處。