![]() |
AW: TObjectList unterschiedliche Objekte erkennen?
Hallo,
Wenn du eine Object vom Typ Caprio tatsächlich mit Create erzeugen würdest, dann könnte dein Code schon funktionieren. Aber aus irgenteinem Grund erzeugst du immer Auto und behauptest über einen Cast das es ein Caprio ist bevor du Werte zuweist. das kann der is Operator aber niemals auflösen. mfg DerDan |
AW: TObjectList unterschiedliche Objekte erkennen?
Du castest ja das Auto nur als Cabrio. Sein tut's immer noch ein TAuto ...So wird ein Schuh draus:
Delphi-Quellcode:
Edit: ups, zu spät.
procedure TForm1.Button3Click(Sender: TObject);
var AutoListe: TObjectList; Cabrio : TCabrio; Coupe : TCoupe; Auto : TAuto; ListenAuto : TObject; i : integer; begin AutoListe := TObjectList.Create; Auto := TAuto.Create; Auto.FHersteller := 'BMW'; Coupe:= TCoupe(Auto); Coupe.FSitze := 4; AutoListe.Add(Coupe); Auto := TAuto.Create; Auto.FHersteller := 'VW'; Cabrio:= TCabrio.Create; Cabrio.FSitze := 2; AutoListe.Add(Cabrio); for i := 0 to AutoListe.Count - 1 do begin ListenAuto := AutoListe.Items[i]; if (ListenAuto is TCabrio) then begin ShowMessage('Es ist ein Cabrio'); end else if (ListenAuto is TCoupe) then begin ShowMessage('Es ist ein Coupe'); end else begin ShowMessage(Auto.ClassName); end; end; end; |
AW: TObjectList unterschiedliche Objekte erkennen?
Alles klar, vielen Dank für eure zahlreichen Antworten. So funktioniert es.
Wollte mir das belegen der Vater-Attribute immer sparen - da diese für jedes abgeleitete Kind ja immer gleich sind - und bin deshalb diesen Weg gegangen. Aber dann belege ich die Attribute halt für jedes Kind. Vielen Dank nochmal Gruß mc |
AW: TObjectList unterschiedliche Objekte erkennen?
Musst Du doch gar nicht.
|
AW: TObjectList unterschiedliche Objekte erkennen?
Zitat:
Delphi-Quellcode:
,
TCoupe(Auto)
sondern die weicheren Casts ala
Delphi-Quellcode:
, den so wäre dir das Problem sofort aufgefallen, weil es im Programm entsprechend geknallt hätte.
(Auto as TCoupe)
PS: Dein Pech war, daß der Zugriff auf das falsch gecastete Objekt nicht auch schon geknallt hatte, denn wenn FSitze erst in TCoupe deklariert wurde, dann gibt es dieses Feld in TAuto nicht, und somit greifst du auf etwas zu, was es nicht gibt, welches nicht unbedingt Gesund ist, für ein Programm. |
AW: TObjectList unterschiedliche Objekte erkennen?
Die bessere Lösung für das Problem wäre wohl die Nutzung der Polymorphie:
- packe eine (abstrakte) virtuelle Methode in TAuto - überschreibe die in den Subklassen - und rufe die einfach mit nem cast auf TAuto (nicht auf die Subklassen) auf ==> keine Casts auf Subklassen nötig und vor allem keine explizite Typabfrage mit is... Siehe auch: ![]() Und mal unabhängig vom konkreten Symptom sind das schon falsche Klassen. Neue Klassen sollte man nur erstellen, wenn diese neuen Klassen auch etwas neues können. Aber kann ein TCoupe mehr als ein TAuto? Oder ist das eigentlich nicht doch eher ein Attribut? mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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