Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem mit Klassendesign (https://www.delphipraxis.net/191593-problem-mit-klassendesign.html)

jus 31. Jan 2017 14:43

Problem mit Klassendesign
 
Hallo,
bis jetzt habe ich objektorientierte Programmierung eher vermieden. Doch für ein aktuelles Projekt hätte ich gerne es eingesetzt, leider scheitert es bei mir an den Grundlagen und ist vermutlich ziemlich trivial. :oops: Da mir die Begriffe für mein Problem fehlen, versuche ich meine Frage zu beschreiben:

Delphi-Quellcode:
type
  TDatabase = class(TObject)
  public
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String);
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;

  TMySQL = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String);
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;

  TMySQLPhpTunnel = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String);
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;
 
implementation

procedure ZeigeInGui(SQL: TDatabase);  //<----- wichtig ist hier!
var
  i,j: Integer;
begin
  SQL.SQLQuery('SELECT * FROM TestTabelle');
  for i:=0 to High(Rows[0])
    for j:=0 to High(Rows) do StringGrid1.Cells[i,j] rows[i,j]; //nur exemplarisch
end;
Ich habe aktuell eine Anwendung, das einerseits Daten von einer lokalen MySQL-Datenbank ausliest und andererseits über PHP Tunnel Daten aus einer MySql-Datenbank ausliest. Für die Datenbankkommunikation habe ich 2 verschiedene Objektklassen erstellt. Doch wie kann man eine Procedure/Funktion (in diesem Fall "procedure ZeigeInGui") bauen, das als Parameter beide Objektklassen (TMySQL u. TMySQLPhpTunnel) akzeptiert. Später sollte auch ein Objekt für MSSQL dazukommen. Wie kann man sowas machen?

lg,
jus

mkinzler 31. Jan 2017 14:48

AW: Problem mit Klassendesign
 
Genau so.

CarlAshnikov 31. Jan 2017 14:59

AW: Problem mit Klassendesign
 
Sieht doch schon gut aus. Es fehlen nur
Delphi-Quellcode:
virtual
und
Delphi-Quellcode:
override
an den entsprechenden Methoden, damit auch die abgeleiteten Versionen benutzt werden.

haentschman 31. Jan 2017 15:02

AW: Problem mit Klassendesign
 
Hallöle...:P
oder über ein Interface. :wink: Sinngemäß: Der Code arbeitet mit dem Interface. Welche "Klasse" das Interface "interpretiert" ist dem Code wurscht... :zwinker:
Eigentlich ein Klassiker wie man es verwendet wenn verschiedene DBMS Verwendung finden. :wink:

TBx 31. Jan 2017 15:06

AW: Problem mit Klassendesign
 
Die Deklaration deiner
Delphi-Quellcode:
procedure
sollte so ok sein.
Nur Deine Klassen solltest Du noch anpassen, in der Elternklasse sollten die Methoden
Delphi-Quellcode:
virtual
und evtl. auch
Delphi-Quellcode:
abstract
sein.
Eine Erklährung findest Du hier und hier.

samso 31. Jan 2017 15:10

AW: Problem mit Klassendesign
 
Die eingestreuten "abstract"s ersparen einem leere Methoden-Hülsen zu erzeugen.
Delphi-Quellcode:
type
  TDatabase = class abstract
  public
    procedure ConnectDB(host,user,pw: String); virtual; abstract;
    procedure SelectDB(DBName:String); virtual; abstract;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); virtual; abstract;
  end;

  TMySQL = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String); override;
    procedure SelectDB(DBName:String); override;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); override;
  end;

  TMySQLPhpTunnel = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String); override;
    procedure SelectDB(DBName:String); override;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); override;
  end;
 
implementation

procedure ZeigeInGui(SQL: TDatabase); //<----- wichtig ist hier!
var
  i,j: Integer;
begin
  SQL.SQLQuery('SELECT * FROM TestTabelle');
  for i:=0 to High(Rows[0])
    for j:=0 to High(Rows) do StringGrid1.Cells[i,j] rows[i,j]; //nur exemplarisch
end;

Noocode 31. Jan 2017 16:54

AW: Problem mit Klassendesign
 
Ich persönlich möchte als weiteren Vorschlag das Entwurfsmuster Factory einbringen.

p80286 1. Feb 2017 12:27

AW: Problem mit Klassendesign
 
Zitat:

Zitat von haentschman (Beitrag 1360467)
Sinngemäß: Der Code arbeitet mit dem Interface. Welche "Klasse" das Interface "interpretiert" ist dem Code wurscht... :zwinker:
Eigentlich ein Klassiker wie man es verwendet wenn verschiedene DBMS Verwendung finden. :wink:

das hört sich interessant an, aber wie macht man das in der Praxis?

Gruß
K-H

TBx 1. Feb 2017 12:37

AW: Problem mit Klassendesign
 
Zitat:

Zitat von p80286 (Beitrag 1360545)
das hört sich interessant an, aber wie macht man das in der Praxis?

Das sieht in der Deklaration ähnlich aus. Man hat nur keine Vererbung und kann auch ganz andere Objekte verwenden, solange diese nur das Interface IDatabase implementieren:
Delphi-Quellcode:
type
  IDatabase = interface
  ['{74C42FE6-FDBD-477E-A74E-CC5841CC8A30}']
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String); virtual;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;

  TMySQL = class(TInterfacedObject, IDatabase)
  public
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String);
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;

  TMySQLPhpTunnel = class(TInterfacedObject, IDatabase)
  public
    procedure ConnectDB(host,user,pw: String);
    procedure SelectDB(DBName:String);
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows);
  end;
 
implementation

procedure ZeigeInGui(SQL: IDatabase); //<----- wichtig ist hier!
var
  i,j: Integer;
begin
  SQL.SQLQuery('SELECT * FROM TestTabelle');
  for i:=0 to High(Rows[0])
    for j:=0 to High(Rows) do StringGrid1.Cells[i,j] rows[i,j]; //nur exemplarisch
end;

jus 2. Feb 2017 23:08

AW: Problem mit Klassendesign
 
Zitat:

Zitat von samso (Beitrag 1360471)
Die eingestreuten "abstract"s ersparen einem leere Methoden-Hülsen zu erzeugen.
Delphi-Quellcode:
type
  TDatabase = class abstract
  public
    procedure ConnectDB(host,user,pw: String); virtual; abstract;
    procedure SelectDB(DBName:String); virtual; abstract;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); virtual; abstract;
  end;

  TMySQL = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String); override;
    procedure SelectDB(DBName:String); override;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); override;
  end;

  TMySQLPhpTunnel = class(TDatabase)
  public
    procedure ConnectDB(host,user,pw: String); override;
    procedure SelectDB(DBName:String); override;
    procedure SQLQuery(Query:String; var Cols:TCols; var Rows:TRows); override;
  end;
 
implementation

procedure ZeigeInGui(SQL: TDatabase); //<----- wichtig ist hier!
var
  i,j: Integer;
begin
  SQL.SQLQuery('SELECT * FROM TestTabelle');
  for i:=0 to High(Rows[0])
    for j:=0 to High(Rows) do StringGrid1.Cells[i,j] rows[i,j]; //nur exemplarisch
end;

Das Beispiel von samso hat schon mal auf Anhieb funktioniert. Vielen Dank für Eure Mühen! :thumb: Das mit den Interfaces muß ich mir in Ruhe mal anschauen.

Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.
Seite 1 von 3  1 23      

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