![]() |
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:
Und dann davon eine abgeleitete Klasse:
type TInputSource = class(TPersistent)
...
Delphi-Quellcode:
In einer anderen Klasse verweise ich nun auf eine Instanz von TInputSource:
TSourceNrCommRS232 = class(TInputSource)
...
Delphi-Quellcode:
Ich nehme hier extra TInputSource weil ich dann jede beliebige abgeleitete Klasse von TInputSource zuweisen kann.
TProjectItemClass = class
private FDeviceSource : TInputSource; ... 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:
Geht das auch irgendwie anders? Ich finde der Typecast macht die Sache arg unübersichtlich.
TSourceNrCommRS232(TProjectItemClass(Node.Data).DeviceSource).TueWas...
Nachtrag: Node.Data ist ein Pointer auf ein TProjectItemClass. DeviceSource ist eine property für FDeviceSource. |
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. |
Re: Zugriff auf abgeleitete Klasse ?
Also ich würde so die Übersicht bewahren:
Delphi-Quellcode:
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.
var
coSourceNrCommRS232: TSourceNrCommRS232; begin if Assigned(TProjectItemClass(Node.Data).DeviceSource) then begin coSourceNrCommRS232 := (TProjectItemClass(Node.Data) as TSourceNrCommRS232); coSourceNrCommRS232.TuWas... end; Meine sozusagen erweiterte Assigned-Methode:
Delphi-Quellcode:
MfG Alaitoctype 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; |
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:
Aber: CleanCode ist was anderes! :-D
var
IrgendeinSource : TInputSource; RS232 : TSourceNrCommRS232 absolute IrgendeinSource; begin IrgendeinSource := Node.Data; RS232.TuWas(); end |
Re: Zugriff auf abgeleitete Klasse ?
Du kannst die Methoden aber auch in der Basisklasse "vorbereiten", indem du sie virtuell + abstract deklarierst:
Delphi-Quellcode:
Wenn du dann auf
type
TInputSource = class(TPersistent) procedure Foo(); virtual; abstract; end; TSourceNrCommRS232 = class(TInputSource) procedure Foo(); override; end;
Delphi-Quellcode:
zugreifst wird die Methode aufgerufen, mit der FDeviceSource erzeugt wurde.
FDeviceSource.Foo();
|
Re: Zugriff auf abgeleitete Klasse ?
Moin !
Danke für die Hinweise. @dominikkv: Ich denke so werde ich das machen. |
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. |
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.
|
Re: Zugriff auf abgeleitete Klasse ?
Zitat:
|
Re: Zugriff auf abgeleitete Klasse ?
Moin !
Nein mit 2010. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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