AGB  ·  Datenschutz  ·  Impressum  







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

wie verschiedene Objekttypen sinnvoll speichern?

Ein Thema von martin28 · begonnen am 31. Okt 2012 · letzter Beitrag vom 3. Nov 2012
Antwort Antwort
martin28

Registriert seit: 3. Jul 2009
Ort: In der Nähe von Berlin.
7 Beiträge
 
#1

wie verschiedene Objekttypen sinnvoll speichern?

  Alt 31. Okt 2012, 14:53
Hi alle zusammen.

Ich grüble schon seit einigen Tagen über folgendes Problem:
Bsp.
Klasse C_Fahrzeug.
Abgeleitet sind C_Motorrad, C_Auto und C_LKW.

Der Benutzer kann als Beispiel mit 4 Buttons Objekte der abgeleiteten Klassen erzeugen und löschen. Dabei hat er aber die Auswahl welchen der 3 er erzeugen will.

Meine Frage: Wie kann ich dies sinnvoll speichern? Zur Zeit nutze ich folgende Konstruktion:
Delphi-Quellcode:
var buttonzuordnung : array[0..3] of record
       typ : integer;
       autotyp : c_auto;
       motorradtyp : c_motorrad;
       lkwtyp : c_lkw;
    end;
Somit muss ich jedesmal, wenn der Benutzer einen anderen Typ wählt :
- die Auswahl in typ speichern
- vorher altes objekt schließen
- zum Schluss ein neues Objekt vom neuen Typ erstellen.

Ich meine, bei diesen 3 Klassen ist es noch erträglich. Wenn aber 10 oder 20 abgeleitete Klassen zur Verfügung stehen, wird es schnell unübersichtlich.

Hat einer einen Tipp für mich ?

Grüße,

Martin
Martin
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 31. Okt 2012, 16:06
Wie wäre es mit XML?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.747 Beiträge
 
Delphi 2007 Professional
 
#3

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 31. Okt 2012, 16:15
Mit "Speichern" meinst du jetzt nicht "Objekt in eine Datei auf der Festplatte speichern", oder hab ich dich falsch verstanden?

Ich glaube, du suchst var buttonzuordnung : array[0..3] of C_Fahrzeug; und statt typ sowas wie if buttonzuordnung[1] is c_auto then ... . Statt der is -Konstruktion wären virtuelle Methoden natürlich wesentlich schöner.

Das mit array[0..3] of C_Fahrzeug; funktioniert, weil du Referenzen auf Objekte einer abgeleiteten Klasse einer Basisklassenreferenz zuweisen kannst, also z.B.
Delphi-Quellcode:
var
  fahrzeug: C_Fahrzeug;
begin
  fahrzeug := C_Auto.Create;
end;
Ohne das würde die ganze OO nicht funktionieren.

BTW: Tu dir und uns den Gefallen und benenn deine Klassen Delphi-konform: TFahrzeug, TAuto etc.
Uli Gerhardt

Geändert von uligerhardt (31. Okt 2012 um 16:20 Uhr)
  Mit Zitat antworten Zitat
martin28

Registriert seit: 3. Jul 2009
Ort: In der Nähe von Berlin.
7 Beiträge
 
#4

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 2. Nov 2012, 22:25
Hi.

@uligerhardt

Die Variante mit array[0..3] of TFahrzeug funktioniert ganz gut. Ich kann die einzelnen abgeleiteten Klassen dort ablegen. Damit ergibt sich für mich jetzt ein weiteres Problem:

Nehmen wir an, das TFahrzeug eine Funktion vom Typ
Code:
function tanken():byte; virtual; abstract;
besitzt.

Für TAuto und TMotorrad nutze ich diese Funktion dann folgendermaßen
Code:
function tanken():byte; reintroduce;
Für die Klasse TLkw möchte ich aber
Code:
function tanken(adblue:boolean):byte; reintroduce;
nutzen.

Wenn ich die Objekte einzeln erzeugen würde, könnte ich die Funktion auch problemlos nutzen
Code:
var golf:TAuto;
var laster:TLkw;
begin
   golf := TAuto.create;
   golf.tanken()
   laster := TLkw.create;
   laster.tanken(TRUE);


Da ich aber jetzt die Deklaration über
Code:
var fahrzeugpool : array[0..3] of TFahrzeug;
und
Code:
   fahrzeugpool[0] := TAuto.create;
   fahrzeugpool[1] := TLkw.create;
nutze, bekomme ich bei
Code:
   adblue_tanken := TRUE;
   fahrzeugpool[1].tanken(adblue_tanken);
ein Compilerfehler. (Too many actual parameters)
Ist ja auch klar, da in der TFahrzeug Funktion tanken() kein weiterer Parameter vorhanden ist.

Wie kann ich dennoch auf die tanken-Funktion vom LKW mit dem Parameter zugreifen?

Grüße,

Martin

PS. habe jetzt alle Namen zur leichteren Lesbarkeit angepasst
Martin
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.747 Beiträge
 
Delphi 2007 Professional
 
#5

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 2. Nov 2012, 22:42
Für TAuto und TMotorrad nutze ich diese Funktion dann folgendermaßen
Code:
function tanken():byte; reintroduce;
Vermutlich willst du override statt reintroduce . Sonst muss die Methode in der Basisklasse ja nicht als virtuell deklariert sein.

Für die Klasse TLkw möchte ich aber
Code:
function tanken(adblue:boolean):byte; reintroduce;
nutzen.

Wenn ich die Objekte einzeln erzeugen würde, könnte ich die Funktion auch problemlos nutzen
Code:
var golf:TAuto;
var laster:TLkw;
begin
   golf := TAuto.create;
   golf.tanken()
   laster := TLkw.create;
   laster.tanken(TRUE);


Da ich aber jetzt die Deklaration über
Code:
var fahrzeugpool : array[0..3] of TFahrzeug;
und
Code:
   fahrzeugpool[0] := TAuto.create;
   fahrzeugpool[1] := TLkw.create;
nutze, bekomme ich bei
Code:
   adblue_tanken := TRUE;
   fahrzeugpool[1].tanken(adblue_tanken);
ein Compilerfehler. (Too many actual parameters)
Ist ja auch klar, da in der TFahrzeug Funktion tanken() kein weiterer Parameter vorhanden ist.

Wie kann ich dennoch auf die tanken-Funktion vom LKW mit dem Parameter zugreifen?
Entweder casten:
TLkw(fahrzeugpool[1]).tanken(adblue_tanken); Oder du nutzt eine Zwischen-Variable:
Delphi-Quellcode:
var
  laster: TLkw;
begin
 laster := TLkw.Create;
 fahrzeugpool[1] := laster;
 laster.tanken(True);
PS. habe jetzt alle Namen zur leichteren Lesbarkeit angepasst
Du wirst mir noch dankbar sein.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 2. Nov 2012, 22:45
TLKW(fahrzeugpool[1]).tanken(adblue_tanken); Einfacher wäre es wenn Du tanken zwar virtual aber nicht abstract deklarierst.

Delphi-Quellcode:
 TFahrzeug=Class
    function tanken():byte; virtual;
  End;
  TLKW=Class(TFahrzeug)
    function tanken():byte; override;
  end;

//__________


{ TFahrzeug }

function TFahrzeug.tanken: byte;
begin
  Showmessage('Fahrzeug tanken')
end;

{ TLKW }

function TLKW.tanken: byte;
begin
   Showmessage('LKW tanken;')
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 f:TFahrzeug; //<<*
begin
   f:=TLKW.Create; //<<*
   f.tanken; // "LKW tanken"
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi ( 2. Nov 2012 um 22:53 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.989 Beiträge
 
Delphi 12 Athens
 
#7

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 3. Nov 2012, 11:50
Wäre für ihn nicht ein Record mit case am besten?

die andere Möglichkeit wäre.
"Tanken" in beiden Versionen überladen in die Basisklasse aufzunehmen.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:57 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