AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

is Operator akzeptiert auch Oberklassen?

Ein Thema von xZise · begonnen am 28. Aug 2010 · letzter Beitrag vom 29. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 12:59
Delphi-Version: 2005
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:
type
  TMutter = class;
  TKind = class(TMutter);
Wie teste ich dann, ob ein Objekt TMutter ist (und nicht TKind)?
Delphi-Quellcode:
var
  x : TObject;
begin
  x := TMutter.Create;
  x is TMutter // sollte true sein
  x is TKind // sollte false sein ist aber true
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 13:14
Delphi-Quellcode:
type
  TMutter = class;
  TKind = class(TMutter);

var
  x : TObject;
begin
  x := TMutter.Create;
  x is TMutter // sollte true sein
  x is TKind // sollte false sein ist aber true
Also bei mir kommt sauber false bei der 2 Prüfung raus. Habe D2010
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 13:27
Wie teste ich dann, ob ein Objekt TMutter ist (und nicht TKind)?
Also uns wurde hier eingetrichtert, dass die Verwendung derartiger Operatoren sowieso Code Smells sind

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;
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 13:35
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:
TPersonZeile = class(TZeile);
TLehrerZeile = class(TPersonZeile);
TSchuelerZeile = class(TPersonZeile);
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.

Ich lasse das auf einen VST anzeigen. Und habe da im GetText:
Delphi-Quellcode:
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';
Und komischerweise tauchen im VST Werte wie TLehrerZeile auf.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 14:33
Delphi-Quellcode:
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';
Und komischerweise tauchen im VST Werte wie TLehrerZeile auf.
Geh den Code doch mal Zeile für Zeile durch:
Delphi-Quellcode:
// 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';
Das müsstest du schon umformulieren
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;
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 16:40
Weil ich habe folgende Klassen:
Delphi-Quellcode:
TPersonZeile = class(TZeile);
TLehrerZeile = class(TPersonZeile);
TSchuelerZeile = class(TPersonZeile);
Das Problem ist, dass hier schon die Struktur falsch ist. Wenn du auf TPersonZeile prüfen willst, dann wirst du automatisch alle anderen auch bekommen, da diese ja alle von TPersonZeile abgeleitet wurden und dementsprechend alle Methoden und Funktionen haben, die TPersonZeile ja auch hat. Du müsstest dafür einen eigenen Typ nehmen oder TLehrerZeile und TSchuelerZeile auch von TZeile ableiten.

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 is TGraphic prüfen kann?
Bernhard
Iliacos intra muros peccatur et extra!

Geändert von rollstuhlfahrer (28. Aug 2010 um 16:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 16:41
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]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 16:47
Du könntest Zeile.Classname verwenden. damit bekommst Du genau die richtige Klasse.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#9

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 16:52
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
Bernhard
Iliacos intra muros peccatur et extra!

Geändert von rollstuhlfahrer (28. Aug 2010 um 17:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

AW: is Operator akzeptiert auch Oberklassen?

  Alt 28. Aug 2010, 16:53
Du könntest Zeile.Classname verwenden. damit bekommst Du genau die richtige Klasse.
Stimmt, aber ich glaube da nehme ich eher sowas wie .Class .ClassType, weil dann meckert der Compiler falls sich der Name ändert und das Refactoring erfasst das mit.

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 x := TKind.Create; heißen (aber das scheint euch ja auch nicht aufgefallen zu sein ).

MfG
Fabian

PS: Okay scheint wohl eher .ClassType zu sein
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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