Konstruktoren nicht vererben *duck*

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Konstruktoren nicht vererben *duck*

Beitrag von RSE »

Bevor ihr mich jetzt schlagt, lest bitte den Grund meines Vorhabens :oops:

Ich möchte Klassen für Gegenstände schreiben. Es gibt z.B. eine Klasse TCustomItem, die die Abmaße implementiert. Diese werden als readonly-Eigenschaft public zur Verfügung gestellt. Initialisiert werden sollen sie über Konstruktor-Parameter. Eine abgeleitete Klasse TCar soll z.B. ein Auto implementieren. In TCar kommen weitere Werte hinzu (z.B. Sitzplätze, PS etc.), die auch bei der Instanzierung im Konstruktor initialisiert werden müssen. Nun erbt aber TCar den Konstruktor von TCustomItem, und dort werden die Sitzplätze nicht initialisiert. Erzeugt man nun TCar mit dem geerbten Construktor von TCustomItem, hat das Auto zwar eine Größe, aber kine Sitzplätze (Membervariable werden immer mit 0, nil, False etc. initialisiert). Aus diesem Grund wäre es sinnvoll den Konstruktor entweder nicht zu vererben oder ihn in TCar irgendwie "verschwinden zu lassen". Der einzige Workaround, der mir spontan einfällt, ist eine Prüfung im Konstruktor von TCustomItem einzubauen und ggf. einen Fehler zu erzeugen. Wie das machbar ist, habe ich mir noch nicht überlegt, ist aber sicherlich irgendwie realisierbar. Den Konstruktor irgendwie unerreichbar zu machen wäre mir allerdings um Längen lieber.

Was gibt es in diesem Fall für Möglichkeiten?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Konstruktoren nicht vererben *duck*

Beitrag von theo »

RSE hat geschrieben: Was gibt es in diesem Fall für Möglichkeiten?
Afaik nicht viele. Du kannst den unerwünschten Konstruktor in TCar überschreiben und dort eine Exception schmeissen oder Standardwerte einfüllen.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Konstruktoren nicht vererben *duck*

Beitrag von RSE »

Hm, das hatte ich befürchtet. Vielleicht fällt einem ja noch was ein. Falls nicht, würde ich es fast ein fehlendes Feature nennen, zumindest kann ich mir gut vorstellen, dass ich nicht der erste mit diesem Problem bin.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Konstruktoren nicht vererben *duck*

Beitrag von mse »

tcar.create() verdeckt doch tcustomitem.create?

Code: Alles auswählen

type
 tcustomitem = class
  private
   fwidth: integer;
   flength: integer;
  public
   constructor create(const awidth,alength: integer);
   property width: integer read fwidth;   
   property lenght: integer read flength;
 end;
 
[...]
 
 tcar = class(tcustomitem)
  private
   fseats: integer;
  public
   constructor create(const awidth,alength: integer; const aseats: integer);  
   property seats: integer read fseats;
 end;
 
{ tcustomitem }
 
constructor tcustomitem.create(const awidth: integer; const alength: integer);
begin
 fwidth:= awidth;
 flength:= alength;
end;
 
{ tcar }
 
constructor tcar.create(const awidth: integer; const alength: integer;
                                                     const aseats: integer);
begin
 fseats:= aseats;
 inherited create(awidth,alength);
end;
 
[...]
var
 car: tcar;
begin
 car:= tcar.create(1,2,3);
end;
Zuletzt geändert von mse am So 20. Dez 2009, 08:48, insgesamt 1-mal geändert.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Konstruktoren nicht vererben *duck*

Beitrag von RSE »

mse hat geschrieben:tcar.create() verdekt doch tcustomitem.create?
Nein, der Kunstruktor wird lediglich überladen, da die Anzahl der Argumente differiert. Nur wenn die Anzahl und Typen der Argumente übereinstimmen, kommt es zu einer Verdeckung.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Konstruktoren nicht vererben *duck*

Beitrag von m.fuchs »

RSE hat geschrieben:
mse hat geschrieben:tcar.create() verdekt doch tcustomitem.create?
Nein, der Kunstruktor wird lediglich überladen, da die Anzahl der Argumente differiert. Nur wenn die Anzahl und Typen der Argumente übereinstimmen, kommt es zu einer Verdeckung.
Hast du das mal ausprobiert?

Ein Aufruf von

Code: Alles auswählen

car:= tcar.create(1,2);

bringt mir jedenfalls

Code: Alles auswählen

Error: Wrong number of parameters specified for call to "create"
mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Konstruktoren nicht vererben *duck*

Beitrag von RSE »

Oha, der Fehler kommt tatsächlich, ich hatte es nur in diesem Vorschaufenster bei der Eingabe gesehen (ToolTip heißt das?). Dann wird das wohl ein Bug in diesem Tooltip-Window sein, denn wenn man es nicht benutzen kann, gehört es m.E. auch nicht dort hinein. Ich werde einen entsprechenden Bugreport absetzen. Was ist die korrekte englische Übersetzung für "verdecken"? Heißt dieses Fenster was einem nach dem Setzen des Punktes die Methoden anzeigt tatsächlich Tooltip Window?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Konstruktoren nicht vererben *duck*

Beitrag von m.fuchs »

RSE hat geschrieben:Oha, der Fehler kommt tatsächlich, ich hatte es nur in diesem Vorschaufenster bei der Eingabe gesehen (ToolTip heißt das?). Dann wird das wohl ein Bug in diesem Tooltip-Window sein, denn wenn man es nicht benutzen kann, gehört es m.E. auch nicht dort hinein. Ich werde einen entsprechenden Bugreport absetzen.
Jo, aber schau vielleicht erstmal ob es mit der aktuellen SVN-Version auch auftritt.
RSE hat geschrieben:Was ist die korrekte englische Übersetzung für "verdecken"?
Hide.


mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten