Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verschiedene Klassen in Klasse (https://www.delphipraxis.net/47513-verschiedene-klassen-klasse.html)

fkerber 12. Jun 2005 09:48


Verschiedene Klassen in Klasse
 
Hi!

Ich habe da mal eine Frage und hoffe, ihr könnt mir helfen.
Ich versuche mal den Sachverhalt so gut es geht darzustellen:

Ich haben ein Klasse TAuto, diese Klasse hat eine Property Fahrer. Jetzt geht es um den Typ dieser Property Fahrer. Momentan ist das eine Klasse TMensch. Allerdings ist diese Klasse für männlich und für weiblich. D.h. ist der Fahrer männlich hat die Klasse trotzdem Eigenschaften, die sie nicht braucht und umgekehrt.
Jetzt dachte ich mir, ich leite mir von TMensch 2 weitere Klassen ab: TMann und TFrau. Jetzt weiß ich aber nicht, wie ich die Property Fahrer setzen soll...
Ich kann sie ja nicht TMann, aber auch nicht TFrau machen.
Gehe ich hin und mache sie TMensch, meckert er, wenn ich eine TFrau zuweise (klar, TFrau hat ja Eigenschaften, die TMensch nicht kennt).

Wie kann man sowas lösen?

Ciao Frederic

alcaeus 12. Jun 2005 09:54

Re: Verschiedene Klassen in Klasse
 
Hallo Frederic,

auf die Schnelle versucht:
Delphi-Quellcode:
type
   TMensch = class(TObject)
      public
         Foo: String;
   end;

   TMann = class(TMensch)
      public
         Bar: String;
   end;

   TFrau = class(TMensch)
      public
         Bar: Integer;
   end;
Anschliessend wird was damit gemacht:
Delphi-Quellcode:
var
   Mann, Frau: TMensch;
begin
   Mann := TMann.Create;
   Frau := TFrau.Create;
   try
      Mann.Foo := 'Mann';
      Frau.Foo := 'Frau';
      TMann(Mann).Bar := 'Bar';
      TFrau(Frau).Bar := 0;
   finally
      Mann.Free;
      Frau.Free;
   end;
end;
Ich kann dein Problem auch nicht nachvollziehen :gruebel: Laut OOP kannst du einer Objektvariable der Klasse TFoo auch ein Objekt der Klasse TBar zuweisen, solange TBar von TFoo abgeleitet wurde ;)

Greetz
alcaeus

DP-Maintenance 12. Jun 2005 09:55

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
Ich schiebs mal nach in die Object Pascal-Sparte. Gehoert wohl eher dorthin.

fkerber 12. Jun 2005 10:07

Re: Verschiedene Klassen in Klasse
 
Hi!

Ich versuchs mal an meinem Originalbeispiel zu erklären.
Ich habe ein Array mit 64 Feldern. Jedes Feld ist vom Typ TField (eigene Klasse). Jedes Feld hat eine Property TPeg (auch eigene Klasse). Jetzt gehe ich hin und leite TPeg ab (neue Klasse: TBauer). Diese hat als zusätzliche Var ein integer Foo.

Jetzt sieht mein Code so aus:

Delphi-Quellcode:
        newBauer:= TBauer.Create;
        newBauer.foo:=8;
        PlayField[i+j+k].peg:=newBauer;
        Showmessage(inttostr((PlayField[i+j+k].peg as TBauer).foo));
Dann sagt er mir:
Zitat:

---------------------------
Debugger Exception Notification
---------------------------
Project Schach.exe raised exception class EInvalidCast with message 'Invalid class typecast'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Außerdem habe ich das Problem bereits wissen zu müssen, dass es sich um einen Bauer handelt, da ich ja einen TypeCast machen muss. Ohne den sagt er mir natürlich, er kennt Foo nicht.

Ciao Frederi

alzaimar 12. Jun 2005 10:15

Re: Verschiedene Klassen in Klasse
 
Wenn der Cursor nach der Meldung in der 'ShowMessage' Zeile steht, ist der Fehler vielleicht auch in der Zeile davor aufgetreten.
Wenn (Bla.peg as TBauer) illegal ist, dann ist eben peg nicht kompatibel zu TBauer. Dann machst Du was Anderes falsch...

Bei deinem Beispiel musst Du aber doch schon wissen, das der peg ein Bauer ist, sonst könntest Du doch seinen Foo nicht anzeigen.

fkerber 12. Jun 2005 10:46

Re: Verschiedene Klassen in Klasse
 
Hi!

TBauer ist ja von TPeg abgeleitet.
Oder was meinst du?

Ciao Frederic

alzaimar 12. Jun 2005 13:48

Re: Verschiedene Klassen in Klasse
 
Gut, wenn also
A. TBaurer = Class (TPeg) und
B. Board.Peg is TPeg dann muss
C. (Board.Peg as TBauer) gehen.

So einfach ist das.

Umkehrschluss: Aus NOT(C)-> not(b) oder not(a).

Wenn Delphi jetzt (scheinbar spinnt), dann ist das natürlich zum haareraufen. Aber hier liegt der Fehler mit Sicherheit bei Dir.
Was passiert, wenn Du nach dem
Delphi-Quellcode:
(PlayField[i+j+k].peg as TBauer).
die Code-completion mit Ctrl+C aufrufst?
und was passiert bei
Delphi-Quellcode:
PlayField[i+j+k].peg.
???

fkerber 12. Jun 2005 14:49

Re: Verschiedene Klassen in Klasse
 
Hi!

Zu a,b,c:
Ja, davon ging ich aus.

Nur, wo soll mein Fehler liegen?


Delphi-Quellcode:
(PlayField[i+j+k].peg as TBauer).
hier zeigt er mir das benötigte foo an, meckert aber es wäre ein invalider TypeCast

im anderen Fall zeigt er mir das benötigte foo natürlich nicht an.


Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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