![]() |
Delphi-Version: 2005
is Operator akzeptiert auch Oberklassen?
Moin,
es gab bestimmt diese Frage schon, aber ich weiß gerade nicht, wie man danach am besten sucht. Aber wenn ich folgendes habe:
Delphi-Quellcode:
Wie teste ich dann, ob ein Objekt TMutter ist (und nicht TKind)?
type
TMutter = class; TKind = class(TMutter);
Delphi-Quellcode:
MfG
var
x : TObject; begin x := TMutter.Create; x is TMutter // sollte true sein x is TKind // sollte false sein ist aber true Fabian |
AW: is Operator akzeptiert auch Oberklassen?
Zitat:
|
AW: is Operator akzeptiert auch Oberklassen?
Zitat:
Zu bevorzugen wäre, für den Grund der Überprüfung ein Attrbut o.ä. einzuführen ala
Code:
TMutter = class
public function canAnswer: Boolean; end; TKind = class(TMutter) ... TMutter.canAnswer: Boolean begin Result := false; end; TKind.canAnswer: Boolean begin Result := true; end; |
AW: is Operator akzeptiert auch Oberklassen?
Moin,
hmmm aber eigentlich wollte ich jetzt nicht mehrere Tausend Zeilen überprüfen und ersetzen. Aber komisch, dass es in der Demo funktioniert. Weil ich habe folgende Klassen:
Delphi-Quellcode:
Anfangs konnte gesagt werden: Suche nach "TSchuelerZeile" oder suche nach "TLehrerZeile". Jetzt gibt es aber auch Elemente die TPersonZeile direkt sind, aber dort findet er alles. Wenn ich jetzt da die Elemente rausnehme, dann sind auch TLehrerZeile dabei, obwohl nur TSchuelerZeile und TPersonZeile drin sein dürften.
TPersonZeile = class(TZeile);
TLehrerZeile = class(TPersonZeile); TSchuelerZeile = class(TPersonZeile); Ich lasse das auf einen VST anzeigen. Und habe da im GetText:
Delphi-Quellcode:
Und komischerweise tauchen im VST Werte wie TLehrerZeile auf.
if Zeile is TSchuelerZeile then
foo else if Zeile is TPersonZeile then Text := Zeile.Classname else Text := 'Shit... ein Lehrer darf da gar net sein'; |
AW: is Operator akzeptiert auch Oberklassen?
Zitat:
Delphi-Quellcode:
Das müsstest du schon umformulieren :wink:
// Angenommen Zeile ist vom Typ TLehrerZeile
if Zeile is TSchuelerZeile then // false, Zeile ist keine Schülerzeile foo else if Zeile is TPersonZeile then // true, Zeile ist PersonZeile Text := Zeile.Classname else // tritt nicht ein Text := 'Shit... ein Lehrer darf da gar net sein'; Denn Lehrerzeilen fallen ja auch unter die Personenzeilen. Wie wärs mit:
Delphi-Quellcode:
if Zeile is TSchuelerZeile then
foo else if Zeile is TLehrerZeile Text := 'Shit... ein Lehrer darf da gar net sein' else Text := Zeile.Classname; |
AW: is Operator akzeptiert auch Oberklassen?
Zitat:
Bernhard PS: Dass der is-Operator auch Vorfahren-Klassen akzeptiert ist sogar gewünscht. Sonst hätte die VCL allerhand Probleme, weil sie sonst nicht dynamisch mit selbst erstellten Klassen zurecht käme und du unter anderem auch ein einfaches Drag&Drop vergessen kannst. (Dort wird die Prüfung ja immer verwendet) PS2: Wie will denn die VCL Bilder anzeigen, wenn sie nicht auf
Delphi-Quellcode:
prüfen kann?
is TGraphic
|
AW: is Operator akzeptiert auch Oberklassen?
Naja, aber wenn "x is TKind" false liefert, warum liefert es dann bei mir true? Und was ist, wenn eine 3. Klasse von TPersonZeile abgeleitet wird.
MfG Fabian PS: [redbox]@Bernhard: Deshalb suche ich eine Möglichkeit zu testen, ob x nur TPersonZeile ist und keine Abgeleitete. Und naja ansonsten steht das hier im Post in der 1. Frage oder nich ;)[/redbox] |
AW: is Operator akzeptiert auch Oberklassen?
Du könntest Zeile.Classname verwenden. damit bekommst Du genau die richtige Klasse.
|
AW: is Operator akzeptiert auch Oberklassen?
Macht es nicht viel mehr Sinn, dafür einfach eine neue Klasse zu definieren und nach der zu suchen? Alles andere mit String-Vergleich und Varianten-Funktionen finde ich etwas übertrieben und was das schlimmste ist: Es ist wartungsbedürftig. Der Delphi-eigene IS-Operator wird auch in ferner Zukunft wie heute funktionieren. Außerdem gibt es Syntax-Fehler, wenn mal was nicht stimmt. Nutzt du z.B. die Methode .ClassString und vergleichst diese mit einer Konstanten, kann es zu Problemen kommen, wenn du dein Programm wegen einem anderen Problem ändern musst.
Du kannst es aber mal mit .ClassType (Da gibt es eine Funktion, die ein TClass zurückliefert) versuchen und dann mit deiner Klasse vergleichen. Hier sollten keine Vorfahren dabei sein. Bernhard PS: Beispiel zu .ClassType in #11 |
AW: is Operator akzeptiert auch Oberklassen?
Zitat:
Argh und mir fällt gerade ein, dass ich ja oben mist angegeben habe. Und zwar ist mein Mutter-Kind Beispiel genau das Gegenteil! Und zwar müsste es ja
Delphi-Quellcode:
heißen (aber das scheint euch ja auch nicht aufgefallen zu sein :mrgreen: ).
x := TKind.Create;
MfG Fabian PS: Okay scheint wohl eher .ClassType zu sein :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz