通用接口成员

时间:2010-01-17 11:16:06

标签: c# interface generics

昨天我问了这个问题并得到了很多好的答案,只是我刚才意识到我的问题是错的,在这里我想重新解释一下。

我有这个界面

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

有了这个成员

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

这很好用,但现在我想创建一个具有可以是Bar或Bar2属性的类,所以就像这样

public class Test
{
  IFoo test;
}

只有这样才能编译,因为Ifoo需要具有泛型类型。只有我事先不知道我是否会使用Bar2或Bar。

我希望我解释得很好,但如果没有,我会尽力让它更清楚。

我正在尝试(仅为了好玩)创建一个Dicom api(医学成像等)。 dicom标准的一部分是ValueRepresentations(VR)。这些类型用于存储图像的(元)信息。

这样的VR是例如:AgeString,Date,UnsignedShort,SequenceOfItems。

对于所有这些VR,我想要一些所有必须实现的方法(编码等)。但我都希望他们能够存储价值。无论是Int,还是DateTime或String,都不应该放在接口中?

3 个答案:

答案 0 :(得分:4)

您还必须使您的Test类具有通用性:

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

答案 1 :(得分:1)

您希望以相同的方式使用两个不同的类,但您可以让它们实现不同的接口(不同的类型参数)。为什么呢?

您是否真的需要严格指定方法的返回值是什么类型?您将如何处理Test类中的不同返回类型?想一想,你可能会意识到它足以返回一个物体。否则,您还需要使Test类具有通用性。

最诚挚的问候 Oliver Hanappi

答案 2 :(得分: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());