我可以传递一个非泛型类型,其中需要泛型类型吗?

时间:2010-03-28 19:33:48

标签: c# generics

我想定义一组收集和保存数据的类。我想按需要或者以负责任的方式称呼他们,就像来电者所喜欢的那样。

为了支持链接,我已经声明了我的界面:

interface IDataManager<T, K>
{
    T GetData(K args);
    void WriteData(Stream stream);
    void WriteData(T data, Stream stream);

    IDataCollectionPolicy Policy;

    IDataManager<T, K> NextDataManager;
}

但每种具体类型的T和K都会有所不同。如果我这样给它:

IDataManager<T, K> NextDataManager;

我假设调用代码只能链接具有相同T和K的类型。有没有办法让它链接任何类型的IDataManager?

我遇到的一件事就是让IDataManager继承自非泛型IDataManager,如下所示:

interface IDataManager { }

interface IDataManager<T, K>: IDataManager
{
    T GetData(K args);
    void WriteData(Stream stream);
    void WriteData(T data, Stream stream);

    IDataCollectionPolicy Policy;

    IDataManager NextDataManager;
}

这会起作用吗?

2 个答案:

答案 0 :(得分:4)

将接口拆分为通用和非泛型部分是一种常见模式,尤其是在将非泛型方法移动到非泛型接口时:

interface IDataManager
{
    void WriteData(Stream stream);
    IDataCollectionPolicy Policy { get; set; }
    IDataManager NextDataManager { get; set; }
}

interface IDataManager<T, K> : IDataManager
{
    T GetData(K args);
    void WriteData(T data, Stream stream);
}

答案 1 :(得分:2)

是的,您提出的解决方案是正确的。一般的做法是(如你所描述的)创建一个非泛型的基类/接口,然后是一个实现/继承它的泛型类/接口。