泛型和并行类层次结构

时间:2009-10-01 11:45:32

标签: generics

我在将泛型与并行类层次结构结合使用时遇到了一些问题。我已经好几次将自己编入这个烂摊子了。

假设我有以下类层次结构: TableColumn - >子类SqlTableColumn,OracleTableColumn 表 - >子类SqlTable,OracleTable 数据库 - >子类SqlDatabase,OracleDatabase

我在基类型上使用泛型,它给出了:

Table<TableColumn>
Database<Table<TableColumn>>

SqlTable<SqlTableColumn>
SqlDatabase<SqlTable<SqlTableColumn>>

OracleTable<OracleTableColumn>
OracleDatabase<OracleTable<OracleTableColumn>>

我感觉这不是一个很好用的泛型。什么是更好的设计?

2 个答案:

答案 0 :(得分:2)

忽略仿制药背后的任何理论原因何时使用它们,这对我来说更自然(在C#中):

class Database<T, C>
    where T : Table<C>
    where C : TableColumn { }
class Table<C>
    where C : TableColumn { }
class TableColumn { }

//sql
class SqlDatabase : Database<SqlTable, SqlColumn> { }
class SqlTable : Table<SqlColumn> { }
class SqlColumn : TableColumn { }

//oracle
class OracleDatabase : Database<OracleTable, OracleColumn> { }
class OracleTable : Table<OracleColumn> { }
class OracleColumn : TableColumn { }

答案 1 :(得分:1)

泛型(如在Java或C#中)实际上是为了支持参数化类型。在这种情况下,您传递的类型(TableColumn,SqlTableColumn)实际上并不是类型参数。

我会将这组类型实现为并行对象层次结构,而不是参数化类型。例如:

OracleTable extends Table
SqlTable extends Table

OracleDatabase extends Database
SqlDatabase extends Database

OracleTableColumn extends TableColumn
SqlTableColumn extends TableColumn

所有这些类型的公共方法应该只引用基类,例如在JDBC中完成。