用于保存不同类型列表的泛型设计模式

时间:2011-06-21 10:18:51

标签: c# generics

我有一个Column类:

class Column<T> where T : IComparable, IConvertible
{
    private List<T> _records;
    ...
}

和一个表类,它应该包含许多不同数据类型的列。

class Table
{
    private List<Column> columns;
    ...
}

显然这不会编译,但我遵循处理这个想法的标准设计模式。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

您可以使用通用的非通用基类或接口:

// or maybe interface IColumn instead, depending on your needs
class Column
{
    // any non-generic stuff common to all columns
}

class Column<T> : Column where T : IComparable, IConvertible
{
    // any generic stuff specific to Column<T>
}

class Table
{
    private List<Column> _columns;
}

答案 1 :(得分:0)

我可以看到,只要有人希望存储从特定类派生并实现特定接口的对象,当你可能希望存储的类时,可以看到执行所描述的内容将是有用的唯一情况(这两者都做了)不共享共同的基本类型。例如,可能存在由Foo,CloneableFoo(源自Foo并实现可克隆接口),DerivedFoo(源自Foo,不实现克隆)和CloneableDerivedFoo(源自Foo和实现克隆),人们可能希望有一种方法可以接受任何允许克隆的Foo衍生物。请注意,CloneableFoo和CloneableDerivedFoo的唯一常见基类型是Foo,它们都不允许克隆。

这个一般问题的解决方案是派生一个接口,ISelf&lt; out T&gt;,其单个成员“self”是类型T的只读属性。任何接口IWhat可能想要结合使用使用另一个接口或基类应该声明一个通用形式IWhatever&lt; out T&gt;它继承了非泛型形式和ISelf&lt; T&gt;。任何实现该样式的任何通用接口的类都应该实现ISelf&lt; ItsOwnClass&gt;以明显的方式(只是回归)。

如果这样做,可以使用实现ISelf的嵌套接口声明一个实现任何接口组合的对象,并且可以在没有类型转换的情况下使用任何此类对象作为其正确类型(通过使用正确数量的“.Self”)财产访问者)。有趣的是,可以将任何实现一组这样的接口的类强制转换为它们的任何嵌套组合。例如,IFoo&lt; IBar&lt; IBoz&lt; WhateverDerived&gt;&gt;&gt;可以对IBoz&lt; IBar&lt; IFoo&lt; WhateverBase&gt;&gt;&gt;进行类型转换。