泛型设计模式,用于保存各种类型的列表

本文关键字:种类 类型 列表 保存 设计模式 用于 泛型 | 更新日期: 2023-09-27 17:59:54

我有一个Column类:

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

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

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

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

有什么想法吗?

泛型设计模式,用于保存各种类型的列表

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

// 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;
}

我能看到的唯一有用的情况是,如果希望存储从特定类派生并实现特定接口的对象,而可能希望存储的类(它们都做这两件事)没有共享一个同时做这两种事的公共基类型。例如,可能有一个由Foo、CloneableFoo(从Foo派生并实现可克隆接口)、DerivedFoo(派生自Foo,但不实现克隆)和CloneableDeriveFoo(衍生自Foo并实现克隆)组成的类型族,并且人们可能希望有一个可以接受允许克隆的Foo的任何派生的方法。请注意,集合中应该允许使用的CloneableFoo和CloneableDerivedFoo的唯一通用基类型是Foo,它不允许克隆。

这个一般问题的解决方案是导出一个接口ISelf<out T>,其单个成员"self"是类型T的只读属性。任何可能希望与另一个接口或基类一起使用的接口IWhatever都应该声明泛型形式IWhatever<out T>其既继承了非通用形式又继承了ISelf<T>。实现该风格的任何通用接口的任何类也应该实现ISelf<ItsOwnClass>以显而易见的方式(只是返回本身)。

如果这样做了,可以使用实现ISelf的嵌套接口来声明一个实现任何接口组合的对象,并且可以在没有类型转换的情况下使用任何此类对象作为其正确类型(通过使用正确数量的".Self"属性访问器)。有趣的是,可以将实现一组此类接口的任何类类型转换为它们的任何嵌套组合。例如,IFoo<IBar<IBoz<WhateverDerived>gt>可以被类型化为IBoz<IBar<IFoo<WhateverBase>gt>。