Instanz welcher abgeleiteten Klasse?
Hallo!
Angenommen, ich habe eine abstrakte Klasse Fahrzeug; Davon leiten sich die Klassen Auto, Fahrrad und Motorrad ab. Im Quelltext arbeite ich dann mit der Variable einFahrzeug : TFahrzeug! Kann ich nun irgend wie testen bzw. abfragen, von welcher Sub-Klasse das Fahrzeug nun genau ist, also ob es ein Auto, Fahrrad, etc. ist? |
Re: Instanz welcher abgeleiteten Klasse?
|
Re: Instanz welcher abgeleiteten Klasse?
du könntest mit dem is/as operator arbeiten. aber das ist in deinem falle wohl nicht im sinne von OOP.
|
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
|
Re: Instanz welcher abgeleiteten Klasse?
Erstmal bekommst du über Classname den Klassennamen als Text.
2. Kannst du den Operator is verwenden (also z.B. Fahrzeug is TAuto). Wobei das auch true ergibt wenn das Objekt widerrum von TAuto abgeleitet ist 3. Über ClassInfo bekommst du die genaue Klasse. Mit einer einfachen Abfrage Fahrzeug.ClassInfo=TAuto kannst du fragen, ob das Objekt wirklich TAuto ist. Ist es abgeleitet von TAuto ergibt der vergleich false (im Gegensatz zu is). |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
|
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Da meckert der Compiler! Er weis da nichts mit TAuto anzufangen. Und ClassInfo gibt mir ja nur einen Pointer... |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Der Compiler bleibt still! Dennoch klappt der if-Vergleich nicht. |
Re: Instanz welcher abgeleiteten Klasse?
oh sorry. Hatte was verwechselt. Statt ClassInfo nimm ClassType. :duck:
|
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
|
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
ja, es mag auch fälle geben, wo man den operator braucht, aber das sollte die ausnahme sein. |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Delphi-Quellcode:
Compiler bringt:Ordinalty erforderlich!?
case objekt.ClassType of
TAuto : edKat.Text := 'Auto'; TMotorrad : edKat.Text := 'Motorrad'; TFahrrad : edKat.Text := 'Fahrrad'; end; |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
|
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Beispiel aus Delphi-Hilfe...
Delphi-Quellcode:
Dann sind diese Beispiel sehr irreführend...!
case MyColor of
Red: X := 1; Green: X := 2; Blue: X := 3; Yellow, Orange, Black: X := 0; end; case Selection of Done: Form1.Close; Compute: CalculateTotal(UnitCost, Quantity); else Beep; end; |
Re: Instanz welcher abgeleiteten Klasse?
ja sind (verkappte) ordinal-werte.
|
Re: Instanz welcher abgeleiteten Klasse?
MyColor ist ja so definiert.
Delphi-Quellcode:
Das bedeutet, das nach Red Green kommt, nach Green Blue usw. Wird halt einfach durchnummeriert
MyColor = (Red,Green,Blue,Yellow,Orange,Black);
Red=0 Green=1 Blue=2 Es ist ein Ordinaltyp weil es immer einen definierten Vorgänger und Nachfolger gibt. Bei Klassen ist es so, dass zum Beispiel TAuto nur auf die Klasseninformationen zeigt könnte also $123456 oder $654321 liegen. TMotorrad könnte dann bei $765432 oder $234567 liegen. Du kannst also nicht sagen, dass nach TAuto TMotorrad kommt. Sind halt nur Zeiger. Vielleicht kann man es einfach mit einem Trick lösen in dem man ClassType zu Interger castet. Kann es leider nicht testen.
Delphi-Quellcode:
case Integer(objekt.ClassType) of
Integer(TAuto) : edKat.Text := 'Auto'; Integer(TMotorrad) : edKat.Text := 'Motorrad'; Integer(TFahrrad) : edKat.Text := 'Fahrrad'; end; |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Und es gilt auch hier: 'Wer case verwendet, der hat objektorientiere programmierung nicht verstanden' :mrgreen: ...Ist vielleicht ein bisschen drastisch formuliert, aber was wahres drann *duck* :-D |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
is brauchst Du dann, wenn Du zum Beispiel Objecte in einer Liste speicherst, welche nicht unbedingt aller derselben Basisklasse (außer TObject) angehören. |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Ich denke auch, dass man bei OOP in "Reinform" kein is braucht, nur: Wem bringt es was, ein Programm zu haben, das als Musterbeispiel in einem Buch über OOP gelten könnte, das Programm dafür aber viel einfacher und schneller implementiert hätte werden können, wenn man die OOP weniger streng ausgelegt hätte? IMHO muss man da stets zwischen Theorie und Realität abwägen. |
Re: Instanz welcher abgeleiteten Klasse?
Zitat:
Das muss nicht sein, dass Du das unbedingt immer wissen musst. Könnte ja auch sein, dass Du diese Liste zur Laufzeit füllst, mit Buttons, StringListen, CheckBoxen, Panels, Frames, eigenen Objekten, etc. Es gibt auch Componenten ich denke da an GridComponenten beispielsweise an ein VerticalGrid, da kann man verschiedenartige Spalten bzw. Zeilen einfügen (auch zur Laufzeit). Wenn Du jetzt durchiterierst über alle Spalten oder Zeilen kannst nicht mehr wissen was das genau ist und nimmst daher den is operator. |
Re: Instanz welcher abgeleiteten Klasse?
Hm, klar, manchmal ist er ganz nützlich. Auch wenn man FindComponent benutzt (wobei man sich auch fragen kann, ob das Design nicht schon Mist ist, wenn man FindComponent braucht ;) ).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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