![]() |
Auf den Typ der aufrufenden Instanz reagieren
Hallo,
folgendes Beispiel:
Delphi-Quellcode:
Wenn ich nun TSmallClass.DoSomething aufrufe, bekomme ich mit einer Wahrscheinlichkeit von ca. 50% die Meldung 'Los gehts!' gezeigt. Danach wird eine Instanz von TBigClass konstuiert und deren DoSomething aufgerufen, die wiederum TBigClass.ReallyDoIt abfragt, die ihrerseits immer false zurückgibt. Kurz: Ich werde nie zweimal 'Los gehts!' angezeigt bekommen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; TBigClass = class(TObject) function ReallyDoIt: boolean; virtual; procedure DoSomething; end; TSmallClass = class(TBigClass) function ReallyDoIt: boolean; override; end; var Form1: TForm1; implementation {$R *.DFM} function TBigClass.ReallyDoIt: boolean; begin result := false; end; procedure TBigClass.DoSomething; var NewBigClass: TBigClass; begin if ReallyDoIt then begin ShowMessage('Los gehts!'); NewBigClass := TBigClass.Create; NewBigClass.DoSomething; NewBigClass.Free; end; end; function TSmallClass.ReallyDoIt: boolean; begin result := false; if random(2) = 1 then result := true; end; end. Um das zu erreichen, müsste TBigClass.DoSomething eine TSmallClass konstruieren, wenn sie als "TSmallClass.DoSomething" aufgerufen wird. Kann man das irgendwie implementieren? Vielen Dank schon mal! Hoffentlich war das verständlich.. :P |
Re: Auf den Typ der aufrufenden Instanz reagieren
Moin Dominik,
warum nimmst Du hier
Delphi-Quellcode:
nicht TSmallClass?
NewBigClass := TBigClass.Create;
Dann hätte es doch den gewünschten Effekt. BTW:
Delphi-Quellcode:
function TSmallClass.ReallyDoIt: boolean;
begin result := false; if random(2) = 1 then result := true; end; // geht auch kürzer function TSmallClass.ReallyDoIt: boolean; begin result := random(2) = 1; end; |
Re: Auf den Typ der aufrufenden Instanz reagieren
Hallo,
Zitat:
Zitat:
Danke. |
Re: Auf den Typ der aufrufenden Instanz reagieren
Hallo Dominik,
die benötigte Klassenreferenz zum Erzeugen einer neuen Instanz erhältst du über ![]()
Delphi-Quellcode:
Wenn den den Constructor später überschreiben möchtest, so daß er Parameter übernimmt, dann solltest du die Klassenreferenz als Typ vereinbaren:
procedure TBigClass.DoSomething;
var NewBigClass: TBigClass; begin if ReallyDoIt then begin [..] NewBigClass := ClassType.Create AS TBigClass; [..] end; end;
Delphi-Quellcode:
Gruß Hawkeye
type
TBigClassType = class of TBigClass; [..] NewBigClass := TBigClassType(ClassType).Create(...); [..] |
Re: Auf den Typ der aufrufenden Instanz reagieren
Funktioniert! Dankeschön!
|
Re: Auf den Typ der aufrufenden Instanz reagieren
Zitat:
hab mir grad mal in der OH den Eintrag dazu angeschaut: Zitat:
Grüße, Chris |
Re: Auf den Typ der aufrufenden Instanz reagieren
Hallo Chris,
man sollte auf ClassType verzichten, wenn es möglich und sinnvoll ist, z.B. bei einer Typabfrage durch den Operator ![]()
Delphi-Quellcode:
Man sieht aber sehr deutlich, wie fehleranfällig eine solche Vorgehensweise ist. Die Reihenfolge der Abfragen ist wichtig (jede TSmallClass ist auch eine TBigClass) - ein Vertauschen der beiden Abfragen mit 'is' liefert nicht mehr das gewünschte Resultat. Zudem muß die Anweisung für jede hinzugenommene Klasse erweitert werden. Die (nicht verbotene) Verwendung von ClassType löst das Problem sehr elegant mit einer Zeile Code.
if Self is TSmallClass then
NewBigClass := TSmallClass.Create else if Self is TBigClass then NewBigClass := TBigClass.Create else raise Exception.Create('nicht vorgesehen'); Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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