我正在尝试实现各种相关类组,如下所示:


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/

10-10 13:38