我正在尝试实现各种相关类组,如下所示:
MySQL数据库
MySQLTable(引用MySQLDatabase)
MySQLRecord(引用一个MySQLTable)
PostGre数据库
PostGreTable(引用PostGreDatabase)
PostGreRecord(引用PostGreTable)
Oracle数据库
...
由于相对类(MySQLTable,PostGreTable等)具有大量共享代码,因此我已使用抽象父类和泛型实现了此共享,例如:
class Database {}
class Table<DatabaseType> where DatabaseType : Database
{
public DatabaseType FDatabase; //this is what I mean by "references"
}
class Record<TableType, DatabaseType> where
DatabaseType : Database
TableType : Table<DatabaseType>
{
public TableType FTable;
}
class MySQLDatabase : Database {}
class MySQLTable : Table<MySQLDatabase>
{
public string FCharset;
}
MySQLRecord : Record<MySQLTable, MySQLDatabase> {}
...
我需要这种架构才能:
防止引用错误。
例如:MySQLTable不能引用PostGreDatabase或OracleDatabase,只能引用MySQLDatabase。
使程序员能够访问对象的特定属性而无需强制转换。
例:
SomeMySQLRecord.FTable.FCharset = 'UTF-8';
代替
((MySQLTable)SomeMySQLRecord.FTable).Charset = 'UTF-8';
我正在寻找一种更优雅的方法(或一种模式)来执行此操作,因为真正的类组具有3个以上的类,而泛型确实在爬行代码。例:
MyType : Type1<GType1, GType2, GType3, GType4> where
GType1 : Type2,
GType2 : Type3<GType1>,
GType3 : Type4<GType1, GType2>,
GType4 : Type5<GType2, GType1, Type2, GType3>
最佳答案
对我而言,泛型在这里没有意义。使用您自己的代码:
Table<DatabaseType : Database>
MySQLTable : Table<MySQLDatabase>
有人会假设还使用泛型定义了MySQLTable,因为您将其定义为Table的子代:
MySQLTable<Something> : Table<MySQLDatabase>
您如何在此处定义Something?这没有道理。
如果您使用泛型来实现此目的:
例如:MySQLTable不能引用PostGreDatabase或OracleDatabase,只能引用MySQLDatabase。
我认为这不是使用泛型的必要和充分条件。
关于oop - 有没有更优雅的方式(或模式)来实现相关类组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14115636/