Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Klassen in Delphi (https://www.delphipraxis.net/16557-klassen-delphi.html)

sakura 19. Feb 2004 09:37

Re: Klassen in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich habe auch ein wenig gelernt. Fakt ist aber, das nicht TRectangle.Draw aufgerufen wird, wenn das Objekt mit TFigure.Create aufgerufen wurde, sondern TFigure.Draw ;-) Ich hätte im schlimmsten Fall eine AV erwartet :mrgreen:

Anbei ein kleines Beispiel, das den obigen Umstand näher betrachtet.

...:cat:...

Jens Schumann 19. Feb 2004 09:52

Re: Klassen in Delphi
 
Hallo,
das hat mein Weltbild zerstört.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TFigure = class(TObject)
    procedure Draw(Caption: string);
  end;

  TRectangle = class(TFigure)
    procedure Draw(Caption: string);
    procedure Show(Caption : String);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TFigure.Draw(Caption: string);
begin
  Messagebox(0, 'Draw Methode von TFigure', @Caption[1], 0);
end;

procedure TRectangle.Draw(Caption: string);
begin
  Messagebox(0, 'Draw Methode von TRectangle', @Caption[1], 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Figure: TFigure;
  Rectangle: TRectangle;
  aObj      : TObject;
begin
  ...
  Figure := TFigure.Create;
  try
    TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw');
      // Show nicht in TFigure trotzdem wird aber TRectangle.Show aufgerufen.
   finally
    FreeAndNil(Figure);
  end;
  ...
end;

procedure TRectangle.Show(Caption: String);
begin
  Messagebox(0, 'Show Methode von TRectangle', @Caption[1], 0);
end;

end.
Das ist nicht zu fassen obwohl Show keine Methode von TFigure ist, wird durch den Cast TRectangle.Show aufgerufen.
Hat jemand dafür eine Erklärung ?

Chewie 19. Feb 2004 10:22

Re: Klassen in Delphi
 
Die Delphi-Hilfe sagt zu statischen Methoden:

Zitat:

Beim Aufruf bestimmt der deklarierte Typ (also der Typ zur Compilierzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird.
D.h. im Compilat steht gar nix von TFigure.Draw, sondern es wird einfach die Methode Draw von TRectangle aufgerufen. Nur bei virtuellen und dynamischen Methoden wird wohl zur Laufzeit eine Typüberprüfung vollzogen.

neolithos 19. Feb 2004 10:24

Re: Klassen in Delphi
 
Eine Klasse besteht soviel ich weis aus einer

Methoden-Tabelle (glaub VMT genannt) und den Daten auch als Instanze bezeichnet.

Beides ist getrennt.


wird nun TRectangle.Show aufgerufen geschieht das so

Delphi-Quellcode:
TRectangle.Show(Figure, 'TFigure.Create / TRectangle(Figure).Draw');
Die Instanze wird als erster Hidden-Parameter übergeben.

EDIT: Hättest du in Show auf einen Member von TRectangle zugegriffen wäre es erst zu einer AV gekommen. Member von TFigure wären ohne Probleme möglich gewesen.

Jens Schumann 19. Feb 2004 10:25

Re: Klassen in Delphi
 
Zitat:

Zitat von Chewie
D.h. im Compilat steht gar nix von TFigure.Draw, sondern es wird einfach die Methode Draw von TRectangle aufgerufen. Nur bei virtuellen und dynamischen Methoden wird wohl zur Laufzeit eine Typüberprüfung vollzogen.

Ahh - das klingt logisch.

tmode00 5. Jul 2005 17:02

Re: Klassen in Delphi
 
http://www.luckie-online.de/Tutorials/ >>tolle wurst, link tod!

Treffnix 5. Jul 2005 17:12

Re: Klassen in Delphi
 
Zitat:

Zitat von tmode00
http://www.luckie-online.de/Tutorials/ >>tolle wurst, link tod!

Ich vermisse mal wieder die Eigeninitiative. Ich hab mich gerade mal von luckie-online.de durchgeklickt und hatte nach weniger als 5 Sekunden das hier http://www.luckie-online.de/Developer/Delphi/Tutorials/

Luckie 5. Jul 2005 17:15

Re: Klassen in Delphi
 
Link korregiert. Aber das wäre auch etwas freundlicher gegangen. :roll:

negaH 5. Jul 2005 17:59

Re: Klassen in Delphi
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
...
    TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw');
...
Ich habe das Tut nicht gelesen, gebe aber Sakura absolut Recht. Dieses Beispiel ist ein absolutes Negativbeispiel wie man es auf garkeinen Fall machen sollte. Es könnte aber als Eingangs-Beispiel für die Vermeidung von harten TypCast bei Klassen dienen. Denn so wie nachfolgend wäre der TypCast OOP konform richtiger gewesen:

Delphi-Quellcode:

 (Figure as TRectangle).Show;
Dieser Typcast würde dann eine Exception zu Laufzeit erzeugen, das TFigure NICHT von TRectangle abgeleitet wurde, und somit auf diesen offensichtlichen Programmierfehler hinweisen.

Gruß Hagen

Luckie 5. Jul 2005 19:05

Re: Klassen in Delphi
 
So, ihr habt mich überzeugt ;), in der neuen Version ist es verbessert. Link siehe erstes Posting.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.
Seite 2 von 5     12 34     Letzte »    

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-2025 by Thomas Breitkreuz