私の質問は、私がまだ問題を抱えている前号 ( 「Java コードを Delphi に変換する際の問題」 ) で書いたものに関連しています。前回の質問で見た Java コードは、Delphi に変換しようとしているファクトリ クラスの一部です。IStandardDataProvider
問題は、ファクトリ内のさまざまなクラスの共通メソッドを含むメイン インターフェイスが呼び出されていることです。ただし、一部のクラスには、それらすべてに共通ではない他のメソッドも含まれているためです。インターフェイスから継承する別のインターフェイスを使用しますIStandardDataProvider
。問題は、ジェネリックを機能させることができないことですか? Java のファクトリー クラス全体を参照してください。これは Delphi ではどのように見えるでしょうか?
public class Factory {
private static HashMap<String, IStandardDataProvider<?>> dataproviders = null;
@SuppressWarnings("unchecked")
public <T extends IStandardDataProvider<?>> T GetDataProvider(String dataProviderName) {
if (dataproviders == null)
buildDataProviderMap();
if (dataproviders.containsKey(dataProviderName)) {
return (T) dataproviders.get(dataProviderName);
} else
return null;
}
private void buildDataProviderMap() {
// Build the database connection, that will be used in all the dataproviders
DatabaseConnectionManager dbConnection = new DatabaseConnectionManager(ConfigurationManager.getConfiguration("sqlConnectionString"));
// Instantiate the Hashmap
dataproviders = new HashMap<String, IStandardDataProvider<?>>();
// Instantiate all the dataprovider implementations, and put them into the hash map
dataproviders.put("EventDataProvider", new LocalEventDataProviderImpl(dbConnection));
dataproviders.put("TaskActivityDataProvider", new LocalTaskActivityDataProviderImpl(dbConnection));
}
}
更新:これが私のデルファイ バージョンです。これを汎用にしようとしています。現在、私は にしかアクセスできませんIStandardDataProvider
。
type
TFactory = class(TObject)
private
DataProvider: TDictionary<string, IStandardDataProvider >;
DbConnectionManager : TDatabaseConnectionManager;
DBConnection : TSQLConnection;
Configuration : TConfigurationManager;
procedure BuildDataProviderMap;
public
constructor Create;
destructor Destroy; override;
function GetDataProvider(DataProviderName: string): IStandardDataProvider;
end;
implementation
constructor TLocalDataProviderFactory.Create;
begin
inherited Create;
DbConnectionManager := TDatabaseConnectionManager.create;
end;
destructor TLocalDataProviderFactory.Destroy;
begin
inherited;
DbConnectionManager.Free;
DataProvider.Free;
end;
function TLocalDataProviderFactory.GetDataProvider(DataProviderName: string): IStandardDataProvider;
begin
if not Assigned(DataProvider) then
BuildDataProviderMap;
if DataProvider.ContainsKey(DataProviderName) then
begin
Result := DataProvider.Items[DataProviderName];
end
else
begin
Result:= nil;
end;
end;
procedure TLocalDataProviderFactory.BuildDataProviderMap;
begin
DataProvider := TDictionary<string, IStandardDataProvider>.Create;
Configuration := TConfigurationManager.Create;
DBConnection := DbConnectionManager.GetConnection(Configuration.GetConfiguration('sqlConnectionString'));
DataProvider.Add('EventDataProvider',TLocalEventDataProviderImpl.create(DBConnection) );
DataProvider.Add('TaskActivityDataProvider',TLocalTaskActivityDataProviderImpl.create(DBConnection) );
end;
end.