0

私の質問は、私がまだ問題を抱えている前号 ( 「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.
4

1 に答える 1