2010-01-17 100 views
2

我昨天問過這個問題,並得到很多很好的答案,只有我才意識到我的問題是錯誤的,在這裏我想要重述它。通用接口成員

我有這個接口

public interface IFoo<T> 
{ 
    T Value(); 
} 

有了這個成員

public class Bar : IFoo<string> 
{ 
    string Value(){return "test";} 
} 
public class Bar2 : IFoo<int> 
{ 
    int Value(){return "1";} 
} 

這工作完全,但現在我想做出有可以是酒吧或BAR2因此喜歡的屬性的類這

public class Test 
{ 
    IFoo test; 
} 

只有這樣纔會編譯,因爲Ifoo需要一個泛型類型。只有我不知道我是否會使用Bar2或Bar。

我希望我解釋得很好,但如果沒有,我會盡量使它更清楚。

我想(只是爲了好玩的緣故),以創建一個DICOM API(醫療影像等)。部分dicom標準是一些ValueRepresentations(VR's)。這些是用於存儲圖像(元)信息的類型。

這樣的VR例如是:AgeString,Date,UnsignedShort,SequenceOfItems。

對於所有這些VR的我想有一些方法,他們都必須實現(編碼等)。但我都希望他們能夠存儲價值。不管這是一個Int,還是一個DateTime或一個字符串,都不應該放入界面中嗎?

+0

如果你不知道了前方的區域將是什麼類型的,那麼你必須使用對象。 –

回答

1

你總是可以做一個通用的接口,以同樣的方式,有一個IEnumerable<T>IEnumerable

public interface IFoo 
{ 
    object Value(); 
} 

實施

public class Bar : IFoo<string>, IFoo 
{ 
    public string Value(){return "test";} 
    object IFoo.Value(){return Value();} 
} 
public class Bar2 : IFoo<int>, IFoo 
{ 
    public int Value(){return 1;} 
    object IFoo.Value(){return Value();} 
} 

測試

IFoo b = new Bar(); 
IFoo b2 = new Bar2(); 
Console.WriteLine(b.Value()); 
Console.WriteLine(b2.Value()); 
+0

我試過類似的東西,但是你有點作弊,不是嗎?請記住:'IEnumerable :IEnumerable',但是你的'IFoo '沒有實現'IFoo' - 也就是說,實現'IFoo '的每個類都必須*隱式*實現'IFoo'。 – Kobi

+0

這不是作弊,我只是忘了。 :) IFoo 不必實施IFoo,但它可能應該。 –

4

你必須讓你的測試類通用以及:

public class Test<T> 
{ 
    IFoo<T> test; 
} 
+0

謝謝,這個伎倆。只有我才意識到我必須提出一個不同的問題:P –

1

你想用兩個不同的類以同樣的方式,但你讓他們實現不同的接口(通過其類型參數不同)。爲什麼?

您是否真的需要嚴格指定該方法的返回值是什麼類型?你將如何處理Test類中的不同返回類型?考慮一下,你可能會意識到這足以返回一個對象。否則,你也需要使Test類成爲通用的。

問候
奧利弗Hanappi

+0

我在原始文章中給出瞭解釋。 ^^非常感謝! –

相關問題