![]() |
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:
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?
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; lg, jus |
AW: Problem mit Klassendesign
Genau so.
|
AW: Problem mit Klassendesign
Sieht doch schon gut aus. Es fehlen nur
Delphi-Quellcode:
und
virtual
Delphi-Quellcode:
an den entsprechenden Methoden, damit auch die abgeleiteten Versionen benutzt werden.
override
|
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: |
AW: Problem mit Klassendesign
|
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; |
AW: Problem mit Klassendesign
Ich persönlich möchte als weiteren Vorschlag das Entwurfsmuster Factory einbringen.
|
AW: Problem mit Klassendesign
Zitat:
Gruß K-H |
AW: Problem mit Klassendesign
Zitat:
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; |
AW: Problem mit Klassendesign
Zitat:
Lg, jus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz