AGB  ·  Datenschutz  ·  Impressum  







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

Zugriff auf abgeleitete Klasse ?

Ein Thema von moelski · begonnen am 13. Apr 2010 · letzter Beitrag vom 13. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 13:55
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:
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#2

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:05
[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.
Uwe Raabe
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:10
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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:11
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!
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:14
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
FDeviceSource.Foo(); zugreifst wird die Methode aufgerufen, mit der FDeviceSource erzeugt wurde.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:16
Moin !

Danke für die Hinweise.

@dominikkv: Ich denke so werde ich das machen.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:27
Der is-Operator überprüft auch nebenbei mit, ob die Variable <> nil ist.
Diese Überprüfung ist davor also überflüssig.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#8

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:32
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:44
Zitat von Phoenix:
...generics...
Er arbeitet mit Delphi 7
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Zugriff auf abgeleitete Klasse ?

  Alt 13. Apr 2010, 14:51
Moin !

Nein mit 2010.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  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 02:14 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