2010-01-17 30 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

我在原始文章中给出了解释。 ^^非常感谢! –