AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Implementation Interface Struktur

Ein Thema von slemke76 · begonnen am 3. Dez 2009 · letzter Beitrag vom 17. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#1

Implementation Interface Struktur

  Alt 3. Dez 2009, 18:55
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 19:06
neben dem Plugin gibt es eine Funktion "GibMirDasInterface"

Delphi-Quellcode:
funktion GibMirDasInterface: IExport;
begin
  Result := TExportCSV.Create;
end;
TExportCSV ist nur innerhalb des Plugins bekannt und die Anwendung kennt nur das Inteface.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 19:07
Und Gib dem Interface eine IID! die Deklaration des Interfaces bruachen alle beteiligten Programme. Nur das Plugin implementiert dieses.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#4

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 19:17
Zitat von himitsu:
neben dem Plugin gibt es eine Funktion "GibMirDasInterface"

Delphi-Quellcode:
funktion GibMirDasInterface: IExport;
begin
  Result := TExportCSV.Create;
end;
Ich hatte einen Fehler in meinem Source - natürlich ist (bei mir) ExportCSV vom Typ IExport.

Zitat von himitsu:
TExportCSV ist nur innerhalb des Plugins bekannt und die Anwendung kennt nur das Inteface.
Aber ich verstehe deinen Post trotzdem nicht (ich glaub, ich steht auf dem Schlauch) -
Die Funktion GibMirDasInterface ist vom Typ IExport und im Typ IExport gibt es keine Möglichkeit, z.B. auf eine Property und/oder auf eine public Variable aus TExportCSV zuzugreifen (klar - hast du ja auch geschrieben).

Nur - wie mache ich das "am besten" - gibt es nichts besseres als meine "SetParameter - Durchschleif - Funktion" ?

Ich sag ja, ich steh auf dem Schlauch

Zitat von sirius:
Und Gib dem Interface eine IID! die Deklaration des Interfaces bruachen alle beteiligten Programme. Nur das Plugin implementiert dieses.
Die Deklaration haben auch alle beteiligten Programme.
Die IID werde ich nachrüsten, Danke !!





Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 19:24
Wenn er die IID eh nicht nutzt, dann isses doch egal (?) ... Delphi legt dann einfach per Zufall irgendeine fest.


z.B.
Du hast eine DLL darin liegt das Plugin.
In der DLL und der EXE kennen beide das Interface,
aber nur die DLL bzw. das Plugin kennt das Objekt die EXE/Anwendung hat garkeinen Zugriff auf die Klasse bzw. das Objekt hinter dem Interface.

Darum auch die Funktion, damit fragt die Anwendung das Plugin nach dem gewünschten Interface
und das Plugin erstellt dann intern das Objekt und gibt nur das Interface darauf der Anwendung.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#6

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 20:25
Hi !

ok - jetzt weiss ich - wir haben uns missverstanden, weil ich im Source einen Fehler gemacht habe; ich habe im Hauptprogramm folgendes stehen:
Delphi-Quellcode:
    ExportCSV:=TExportCSV.Create;
    ExportCSV.SetParameter('FExportDir', 'C:\csvdir');
Was funktioniert, weil ich ein "uses" auf die T_ExportCSV.pas habe

Die Implementation von "gibmirdasinterface" ist da natürlich sauberer - nur wo und wie implementiere ich das
- Im Plugin (Implementierung) als "function TExportCSV.GibMirDasInterface: IExport;" kann es ja nicht funktionieren - du hast ja auch "ausserhalb" geschrieben.
- Im Plugin (Implementierung) als "function GibMirDasInterface: IExport;" brauche ich ja wieder das "uses" auf meine Plugin-Implementation - dann kann ich auch gleich den Klassennamen nehmen ? Ausserdem würde doch "Bezeichner redefiniert" bei dem zweiten geladenen Plugin kommen ?
- In das Interface ? Macht gar keinen Sinn, weil es Plugins gibt, die die Klasse TExportCSV implementieren und andere, die TExportSQL implementieren.
- handelt es sich um eine vordefinierte Systemfunktion ?

Ich glaube, das ist heute nicht mein Tag....
...oder ich habe das was grundsätzliches missverstanden.

Danke,
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 20:41
wie hast du die Plugins denn aktuell?

entweder liegt das Plugin z.B. in einer DLL, dann wird "nur" diese Funktion exportiert
- oder notfalls mehrere Funktionen für weitere Interfaces
- Beide (EXE/DLL) kennen je eine "Kopie" des Interfaces
- und die sonstige Komunikation läuft über das Interface

oder du legst alles in eine Unit.
- da liegt im Interface-Abschnitt nur diese Funktion und die ganze Klasse liegt unter "Implementation"
- und dann importieren Programm und Unit einfach nur noch das selbe Interface von einer gemeinsamen Unit
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 20:44
Zitat von himitsu:
Wenn er die IID eh nicht nutzt, dann isses doch egal (?) ... Delphi legt dann einfach per Zufall irgendeine fest.
Ich bin mir jetzt nicht sicher, ob Delphi dann eine festlegt. Aber dennoch: in DLL und Hauptprogramm sollten aber die selben IIDs verwendet werden. Und wie macht Delphi das?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 20:50
wenn du einmal das Interface hast, dann ist die IID soweit egal

und wird höchstens mal genutzt, wenn du das Interface vergleichen/prüfen/abfragen/casten willst.
(da wird ja die IID verglichen und nicht der Name)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Implementation Interface Struktur

  Alt 3. Dez 2009, 22:06
Aber eine Zuweisung entspricht ja bei Interfaces immer einem "Cast"
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz