Hallo zusammen,
ich habe hier eine Anwendung, die mittels Plugins Daten exportieren soll. Zu dem Thema Plugins gibt es ja sowohl hier im Board als auch im Internet eine Menge Themen.
Ich habe mich dazu entschlossen, mit einem "type IExport = interface" zu arbeiten; also _nicht_ mit einer Klasse, die weitervererbt und deren Methoden überschrieben werden.
Nun zum Problem
:
Ich möchte zum einen einen
CSV-Export, zum anderen einen
SQL-Adapter schreiben. Beide haben natürlich eine Methode "Export", allerdings haben beide auch _unterschiedliche_ Properties - für
CSV brauche ich einen Pfad, für
SQL brauche ich einen Connectionstring.
Nun suche ich einen eleganten Weg, nicht alle nur denkbaren Parameter in das Interface reinzuschreiben - die dann je nach Anwendungsfall ungenutzt wären. Wie kann man das am besten machen ?
Eine Idee dazu habe ich, weiss aber nicht, ob die "elegant" ist - das ganze sähe so aus:
Interface:
Delphi-Quellcode:
type
IExport = interface
procedure Export(.....);
procedure SetParameter(paramname, value: string);
end;
Implementation:
Delphi-Quellcode:
unit T_ExportCSV;
type
TExportCSV =
class(TInterfacedObject, IExport)
protected
procedure Export(.........);
procedure SetParameter(paramname, value:
string);
private
FExportDir:
string;
public
constructor Create;
destructor Destroy;
override;
end;
implementation
procedure TExportCSV.
Export(.........);
...
procedure TExportCSV.SetParameter(paramname, value:
string);
begin
if (paramname='
FExportDir')
then FExportDir:=value;
// ToDo: Plausi Checks
end;
Hauptprogramm:
Delphi-Quellcode:
var
ExportCSV: IExport; // !!! Typ IExport, nicht TExportCSV!
begin
ExportCSV:=TExportCSV.Create;
ExportCSV.SetParameter('FExportDir', 'C:\csvdir');
Vorweg: Ich kann NICHT ExportCSV vom Typ TExportCSV machen, das wäre zum einen ja an meiner Pluginstruktur "vorbei" zum anderen will ich später ein Array vom Typ TExport verwenden, in dem sowohl die
SQL als auch die
CSV-Plugins verwaltet werden sollen.
Gibts eine bessere Möglichkeit und
Kann ich in "SetParameter" das "If" vermeiden mit sowas wir Var(paramname):=value ???
lg
Sebastian