Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriff auf abgeleitete Klasse ? (https://www.delphipraxis.net/150308-zugriff-auf-abgeleitete-klasse.html)

moelski 13. Apr 2010 13:55


Zugriff auf abgeleitete Klasse ?
 
Moin !

Ich steh gerade irgendwie aufm Schlauch und brauche mal einen Tip ...

Also ich habe ne Klasse die mir als Basis dient:
Delphi-Quellcode:
type TInputSource = class(TPersistent)
...
Und dann davon eine abgeleitete Klasse:
Delphi-Quellcode:
  TSourceNrCommRS232 = class(TInputSource)
...
In einer anderen Klasse verweise ich nun auf eine Instanz von TInputSource:
Delphi-Quellcode:
  TProjectItemClass = class
  private
    FDeviceSource        : TInputSource;
...
Ich nehme hier extra TInputSource weil ich dann jede beliebige abgeleitete Klasse von TInputSource zuweisen kann.

Soweit so gut :)

Nun würde ich aber gerne auf eine Eigenschaft zugreifen die in TSourceNrCommRS232 definiert ist.
Das klappt aber (so wie ich das sehe) nur mit einem Typecast:
Delphi-Quellcode:
TSourceNrCommRS232(TProjectItemClass(Node.Data).DeviceSource).TueWas...
Geht das auch irgendwie anders? Ich finde der Typecast macht die Sache arg unübersichtlich.


Nachtrag:
Node.Data ist ein Pointer auf ein TProjectItemClass.
DeviceSource ist eine property für FDeviceSource.

Uwe Raabe 13. Apr 2010 14:05

Re: Zugriff auf abgeleitete Klasse ?
 
[quote="moelski"]Geht das auch irgendwie anders? Ich finde der Typecast macht die Sache arg unübersichtlich.[quote]

Der Typecast kann auch schiefgehen, wenn die tatsächlich mal eine andere Klasse dahinter steht.

Wenn die Eigenschaft wirklich nur in der einen Klasse existiert kommst du um den Typecast so nicht herum, solltest aber übrprüfen, ob es auch wirklich die Klasse ist.

Alternativ arbeitest du mit Interfaces, ist aber nur dafür etwas aufwändig.

Alaitoc 13. Apr 2010 14:10

Re: Zugriff auf abgeleitete Klasse ?
 
Also ich würde so die Übersicht bewahren:

Delphi-Quellcode:
var
  coSourceNrCommRS232: TSourceNrCommRS232;
begin
  if Assigned(TProjectItemClass(Node.Data).DeviceSource) then
  begin
    coSourceNrCommRS232 := (TProjectItemClass(Node.Data) as TSourceNrCommRS232);
    coSourceNrCommRS232.TuWas...
  end;
Wobei ich da bei sagen muss das ich noch überprüfen würd ob das Objekt von dem Typ ist und ich würd niemals wenn nicht notwendig einen Hardcast machen.

Meine sozusagen erweiterte Assigned-Methode:

Delphi-Quellcode:

type
  TCustomClass = class of TObject;

function AssignedType ( coObject: TObject; ctClassType: TCustomClass ): Boolean;
begin
  // Definieren eines Symbols zum Kapseln des IF-Befehls
  // ( Delphi-Hilfe ): Abwärtskompatibilität
  {$DEFINE NoFullBoolCheck}
  {$IFDEF NoFullBoolCheck}
     // Initialisierung
    {$UNDEF BSAVED}
     // Setzen des Compiler-Schalters auf OFF, wenn er aktiv ist
     // Compilerschalter $B
     // ( Syntaxoptionen : Boolesche Ausdrücke vollständig. )
    {$IFOPT B+}
      // Setzen eines Flags, damit der Schalter auf den Ursprungszustand
      // zurückgesetzt werden kann.
      {$DEFINE BSAVED}
      {$B-}
    {$ENDIF}
    // Compiler-Schalter darf nicht gesetzt sein, da sonst immer die boolsche Abfrage komplett durchgeführt wird
    // und es zu einer Zugriffsverletzung kommen kann wenn coObject nicht Assigned() ist.
    result := ( Assigned( coObject ) and ( coObject is ctClassType ) );
    {$IFDEF BSAVED}
      // Wenn vorher aktiv, wird der Compilerschalter wieder auf ON geschaltet
      {$B+}
    {$ENDIF}
  {$ENDIF}
end;
MfG Alaitoc

chaosben 13. Apr 2010 14:11

Re: Zugriff auf abgeleitete Klasse ?
 
Du könntest eine absolute Variable nehmen (wenn du genau weißt, das es eine RS232-InputSource ist).

Delphi-Quellcode:
var
  IrgendeinSource : TInputSource;
  RS232 : TSourceNrCommRS232 absolute IrgendeinSource;
begin
  IrgendeinSource := Node.Data;
  RS232.TuWas();
end
Aber: CleanCode ist was anderes! :-D

dominikkv 13. Apr 2010 14:14

Re: Zugriff auf abgeleitete Klasse ?
 
Du kannst die Methoden aber auch in der Basisklasse "vorbereiten", indem du sie virtuell + abstract deklarierst:
Delphi-Quellcode:
type
  TInputSource = class(TPersistent)
    procedure Foo(); virtual; abstract;
  end;

  TSourceNrCommRS232 = class(TInputSource)
    procedure Foo(); override;
  end;
Wenn du dann auf
Delphi-Quellcode:
FDeviceSource.Foo();
zugreifst wird die Methode aufgerufen, mit der FDeviceSource erzeugt wurde.

moelski 13. Apr 2010 14:16

Re: Zugriff auf abgeleitete Klasse ?
 
Moin !

Danke für die Hinweise.

@dominikkv: Ich denke so werde ich das machen.

Blup 13. Apr 2010 14:27

Re: Zugriff auf abgeleitete Klasse ?
 
Der is-Operator überprüft auch nebenbei mit, ob die Variable <> nil ist.
Diese Überprüfung ist davor also überflüssig.

Phoenix 13. Apr 2010 14:32

Re: Zugriff auf abgeleitete Klasse ?
 
Man könnte mit generics arbeiten und eine TProjectItemClass<T> machen. T wäre dann konkret TSourceNrCommRS232 und hat eine Generic Contraint auf TInputSource. Somit bist Du immer Typesafe.

dominikkv 13. Apr 2010 14:44

Re: Zugriff auf abgeleitete Klasse ?
 
Zitat:

Zitat von Phoenix
...generics...

Er arbeitet mit Delphi 7

moelski 13. Apr 2010 14:51

Re: Zugriff auf abgeleitete Klasse ?
 
Moin !

Nein mit 2010.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.
Seite 1 von 2  1 2      

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