Originally Posted by
cpri
(hopelijk zo wat duidelijker)
Niet helemaal, maar je kunt WriteToDB virtueel maken en implementeren in de afgeleiden.
Dan hoef je importdata ook alleen maar in je basisklasse te hebben.
Moet je alleen nog zorgen dat die afgeleiden ergens (een dataset) naar kunnen schrijven, dus die
moet je dan of meenemen als parameter, of je neemt een variabele op in je basisklasse (die laatste
optie zou persoonlijk niet mijn voorkeur hebben, overigens).
Dus iets van:
Delphi Code:
uses
Classes, SysUtils, DB;
type
TBasisKlasse = class(TObject)
public
procedure ImportData(AFileName: TFileName);
procedure WriteToDB(ADataSet: TDataSet; AFileName: TFileName); virtual;
end;
TAfgeleideKlasse = class(TBasisKlasse)
public
procedure WriteToDB(ADataSet: TDataSet; AFileName: TFileName); override;
end;
implementation
uses
ADODB;
{ TBasisKlasse }
procedure TBasisKlasse.ImportData(AFileName: TFileName);
var
Q: TADOQuery;
begin
Q := TADOQuery.Create(nil);
try
// Q.Connection := Set connection here
Q.SQL.Text := 'SELECT * FROM BestandenTabel WHERE 1 = 0';
Q.Append;
WriteToDB(Q, AFileName);
Q.Post;
finally
Q.Free;
end;
end;
procedure TBasisKlasse.WriteToDB(ADataSet: TDataSet; AFileName: TFileName);
begin
if not FileExists(AFileName) then
raise Exception.CreateFmt('Kan bestand %s niet vinden', [AFileName]);
end;
{ TAfgeleideKlasse }
procedure TAfgeleideKlasse.WriteToDB(ADataSet: TDataSet; AFileName: TFileName);
begin
inherited WriteToDB(ADataSet, AFileName); // De basisklasse controleert of het bestand bestaat
ADataSet.FieldByName('BestandsNaam').AsString := AFileName;
end;
Bovenstaand is een heel onzinnig (en ongerelateerd aan jouw klassen) voorbeeld, waarbij de basisklasse
ImportData implementeerd: hier wordt een query geopend met een append, zodat WriteToDB in een
afgeleide klasse een bepaald veld op kan slaan in de database (in dit geval het veld "Bestandsnaam").
In dit geval roept de afgeleide klasse eerst zijn ouder aan (door de inherited), welke controleert of
het bestand wel bestaat en wanneer er geen exception optreedt (en dus het bestand bestaat), wordt het
veld opgeslagen.
Overigens heb je een memory leak als CheckFileName false is (create en free moeten ook eigenlijk
omgeven zijn van een try...finally...end-blok), maar dit terzijde.
En beter kijkend ziet het geheel daar er sowieso wel heel vreemd uit...
Bookmarks