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, 13: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.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 31. Okt 2012, 15: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.735 Beiträge
 
Delphi 2007 Professional
 
#3

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 31. Okt 2012, 15: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 15: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, 21: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.735 Beiträge
 
Delphi 2007 Professional
 
#5

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 2. Nov 2012, 21: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, 21: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 21:53 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 3. Nov 2012, 10: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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 3. Nov 2012, 11:03
Eine andere Möglichkeit wäre eine von der Basisklasse eine weitere Basisklasse zu erstellen mit der geänderten Methode und die konkreten davon ableiten.

Für die Verarbeitung der einzelnen Instanzen würde sich dann das Visitor-Pattern empfehlen, wo auf diese Abweichungen reagiert werden kann.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 3. Nov 2012, 11:39
Diese "tanken"-Methode ist schon in der Basisklasse kaputt.
Beim Tanken gibt es zwei wichtige Parameter: die Menge und die Art des Sprits.
Delphi-Quellcode:
TSpritSorte = (sDefault{=Spritsorte die ein Fahrzeug normalerweise benötigt},
   sBenzin, sDieselPkw, sSuperE5, sSuperE10);
TFahrzeug=Class
  procedure tanken(liter:Currency; sorte:TSpritSorte); virtual;
End;
Wenn man Klassen ableitet, dann darf man nicht die Signatur von virtuellen Methoden in abgeleiteten Klassen ändern.
Man muss virtuelle Methoden so anlegen, dass sie immer passen.

Falls es trotzdem klemmt liegt das daran, das ein Fahrzeug nicht zwingend betankt werden muss.
Ein Fahrrad ist z.B. auch ein Fahrzeug; braucht aber keinen Sprit.
Beim LKW ist das Nachfüllen von Harnstoff (AdBlue) eher ein Wartungsvorgang als ein Tankvorgang (so wie man Motoröl und Wischwasser nachfüllt).

siehe auch: Kreis-Ellipse-Problem

Geändert von sx2008 ( 3. Nov 2012 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: wie verschiedene Objekttypen sinnvoll speichern?

  Alt 3. Nov 2012, 15:08
Das sehe ich nicht so, ich würde die Methode tanken eher so aufbauen, dass ich übergebe, wo das Fahrzeug tanken soll.

Welchen Treibstoff und welche Menge, dass weiß das Fahrzeug selber (volltanken oder nur soviel um das nächste Ziel zu erreichen) und kann dann die "Tankstelle" fragen, ob es den Treibstoff xy dort in ausreichender Menge noch gibt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 16:09 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