我在将泛型与并行类层次结构结合使用时遇到了一些问题。我已经好几次将自己编入这个烂摊子了。
假设我有以下类层次结构: TableColumn - >子类SqlTableColumn,OracleTableColumn 表 - >子类SqlTable,OracleTable 数据库 - >子类SqlDatabase,OracleDatabase
我在基类型上使用泛型,它给出了:
Table<TableColumn>
Database<Table<TableColumn>>
SqlTable<SqlTableColumn>
SqlDatabase<SqlTable<SqlTableColumn>>
OracleTable<OracleTableColumn>
OracleDatabase<OracleTable<OracleTableColumn>>
我感觉这不是一个很好用的泛型。什么是更好的设计?
答案 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中完成。