![]() |
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:... |
Re: Klassen in Delphi
Hallo,
das hat mein Weltbild zerstört.
Delphi-Quellcode:
Das ist nicht zu fassen obwohl Show keine Methode von TFigure ist, wird durch den Cast TRectangle.Show aufgerufen.
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. Hat jemand dafür eine Erklärung ? |
Re: Klassen in Delphi
Die Delphi-Hilfe sagt zu statischen Methoden:
Zitat:
|
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:
Die Instanze wird als erster Hidden-Parameter übergeben.
TRectangle.Show(Figure, 'TFigure.Create / TRectangle(Figure).Draw');
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. |
Re: Klassen in Delphi
Zitat:
|
Re: Klassen in Delphi
![]() |
Re: Klassen in Delphi
Zitat:
![]() |
Re: Klassen in Delphi
Link korregiert. Aber das wäre auch etwas freundlicher gegangen. :roll:
|
Re: Klassen in Delphi
Delphi-Quellcode:
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:
procedure TForm1.Button1Click(Sender: TObject);
... TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw'); ...
Delphi-Quellcode:
Dieser Typcast würde dann eine Exception zu Laufzeit erzeugen, das TFigure NICHT von TRectangle abgeleitet wurde, und somit auf diesen offensichtlichen Programmierfehler hinweisen.(Figure as TRectangle).Show; Gruß Hagen |
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. |
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