Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inherited (https://www.delphipraxis.net/135875-inherited.html)

Highttower 19. Jun 2009 08:49


inherited
 
Hallo zusammen,
ich bin von C++ auf Delphi umgestiegen und bin grad auf der Suche nach nem Abstrakt Fehler in einer DLL Datei ... dabei bin ich auf Folgendes Kosntrukt gestoßen:

Delphi-Quellcode:

TKlasse1 = class (TComponent)
private
...
public
constructor Create(AOwner: TComponent);

end;

TKlasse2 = class(TKlasse1)
private
...
public
constructor Create(AOwner: TComponent);

end;

TKlasse3 = class(TKlasse2)
private
...
public
constructor Create(AOwner: TComponent);

end;

TKlasse4 = class(TKlasse3)
private
...
public
constructor Create(AOwner: TComponent);

end;

impelentation

constructor TKlasse4.Create(AOwner: TComponent);
begin
inherited;
...
end;

constructor TKlasse3.Create(AOwner: TComponent);
begin
inherited;
...
end;

constructor TKlasse2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;

constructor TKlasse1.Create(AOwner: TComponent);
begin
....
end;
Kann mir jemand erklären ob es einen unterschied zwischen "inherited;" und "inherited Create(AComponent);" gibt? Und wenn ja welchen? Oder sind das einfach nur Altlasten von Delphi x.y. Achja ich weiß nicht ob das relevant ist ich nutze das RAD-Studio 2007.

Vielen Dank,

Tobi

mkinzler 19. Jun 2009 09:20

Re: inherited
 
Delphi-Quellcode:
inherited;
ruft die identische Methode der Superklasse auf.
Delphi-Quellcode:
inherited Create(AComponent);
ruft fest
Delphi-Quellcode:
Create(AComponent);
auf.
In diesem fall sollte es das selbe sein

mleyen 19. Jun 2009 10:23

Re: inherited
 
Dazu hätte ich jetzt auch mal eine Frage.

Ziemlich oft habe ich Konstrukte wie folgende:

Delphi-Quellcode:
unit Unit1;

interface

type
  TBossClass = class(TObject)
  private
    Fv1: Integer;
  public
    constructor Create(v1: Integer);
  end;

  TChildClass = class(TBossClass)
  private
    Fv1, Fv2: Integer;
  public
    constructor Create(v1, v2: Integer);
  end;

  TSubChildClass = class(TChildClass)
  private
    Fv1, Fv2, Fv3: Integer;
  public
    constructor Create(v1, v2, v3: Integer);
  end;

implementation

constructor TBossClass.Create(v1: Integer);
begin
  Fv1 := v1;
end;

constructor TChildClass.Create(v1, v2: Integer);
begin
  inherited Create(v1);
//  inherited; // <-- geht leider nicht ;(
  Fv2 := v2;
end;

constructor TSubChildClass.Create(v1, v2, v3: Integer);
begin  
  inherited Create(v1, v2); // Wie ich so Fehler wie Create(v2, v1); hasse! Da sucht man Stunden nach! ._0
//  inherited; // <-- geht immer noch nicht ;(
  Fv3 := v3;
end;

end.
Es gibt eine Oberklasse, von der ich immer mehr und immer weiter abgeleite, bis ich dann irgendwann am 'Endobjekt' bin.
Von diesen 'Endobjekten' muss ich dann oftmals ziemlich viele erstellen, da nervt es einfach immer wieder "inherited BluppMethode(MilliardenVonParametern, ....)" aufzurufen. Das ist nachher einfach nur noch ein erheblicher Zeitaufwand und wie ich gemerkt habe schleichen sich da schnell Flüchtigkeitsfehler ein. (Falsche Parameterreihenfolge)

Jetzt die eigentliche Frage:
Gibt es nicht irgendeine Möglichkeit, um die übergeordnete Methode mit deren normalen Parametern aufzurufen, ohne deren Parameter immer neu anzugeben?
(Beim überschreiben der Methoden kommen bei mir immer nur neue Parameter hinten dran)

Edit:
Ansonsten versuch ich mal ein IDE-Plugin zu schreiben.

Reinhard Kern 19. Jun 2009 13:34

Re: inherited
 
Hallo,

der Compiler kann doch nicht wissen ob du inherited Create(v1, v2) meinst oder inherited Create(v2, v1) oder auch inherited Create(v1, 25) - das steht dir ja frei, mit oder ohne Hass.

Gruss Reinhard

Blup 19. Jun 2009 13:52

Re: inherited
 
Den Constructor nicht mit Parametern überfrachten.
Dafür gibt es Property.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 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