AGB  ·  Datenschutz  ·  Impressum  







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

Generisches Typecasting?

Ein Thema von Stevie · begonnen am 7. Sep 2004 · letzter Beitrag vom 9. Sep 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:14
Zitat von Muetze1:
Ich habe dir doch nun schon versucht zu schreiben warum es nicht gehen kann, also in wie fern sollte es denn nun noch eine Lösung dazu geben?
Nun, es gibt in der RTTL doch die Möglichkeit dynamisch die published Elemente dynamisch auszulesen, gell?
Und für Libraries gibt es die Möglichkeit dynamisch irgendwelche Funktionen zu laden und auszuführen.
Dann könnte es doch auch möglich sein, anhand der Klasseninformation eine Funktion zu finden und auzuführen, oder?
Es ist ja schließlich auch möglich dynamisch irgendwelche Klassen zu erstellen, wenn sie registriert sind.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#12

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:29
Ja, wenn die published sind ist das kein problem. Einfach den pointer holen und eine methoden-variable zusammen basteln:
Delphi-Quellcode:
type
  TMyCall = procedure of object;
var
  method:TMethod;
...
method.data := myObj;
method.code := myObj.MethodAddress('Perform');
...
if method.code <> nil then TMyCall(method); // dies ist der aufruf!

// edit: verdammte kommentare
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:39
Moin!

Zitat von Stevie:
Nun, es gibt in der RTTL doch die Möglichkeit dynamisch die published Elemente dynamisch auszulesen, gell?
Mit den RTTI Informationen kannst du zur Laufzeit published Properties finden und "bearbeiten" - richtig. Bei deinem TypeCast müssten aber die RTTI Informationen Informationen für alle Methoden ausser private haben - die gibt es nicht und daher sind die Methoden schlecht zu finden in der Laufzeit.

Zitat von Stevie:
Und für Libraries gibt es die Möglichkeit dynamisch irgendwelche Funktionen zu laden und auszuführen.
Die DLL's haben eine Tabelle wo der Name und/oder Index zu der Funktion drinne steht und anhand der Informationen wie auch die ganzen Relocation Informationen kann der Code Teil geladen, angepasst und ausgeführt werden. Diese Informationen fehlen einem auch hier wiederrum.

Zitat von Stevie:
Dann könnte es doch auch möglich sein, anhand der Klasseninformation eine Funktion zu finden und auzuführen, oder?
Welche Klasseninformationen? Den Klassennamen kann man ja noch ohne Probleme rausfinden - da bietet dir ja TObject schon die Methode ClassName an, aber es werden keine Informationen vorgehalten über alle Methoden in der Klasse (bis auf die private Methoden) wie schon oben gesagt, daher hat man wenig Chancen. Und der Compiler wird bestimmt nicht über alle in dem Programm verwendeten Klassen eine Sprungtabelle aufbauen mit den Offsets zu alles möglichen Methoden und deren Namen.

Zitat von Stevie:
Es ist ja schließlich auch möglich dynamisch irgendwelche Klassen zu erstellen, wenn sie registriert sind.
Das ist doch wieder was anderes: Dort wird doch nur eine MetaClass angelegt die die Klassen aufnehmen und somit könnten sie ja instanziiert werden. Das Problem ist hierbei aber das gleiche wie bei dir: Es können von den so instanziierten Instanzen nur die Methoden aufgerufen werden, die auch die Basis-Metaklasse auch kennt. D.h. wenn die Basis MetaKlasse von TObject stammt (Class Of TObject), dann kannst du dort kein Perform in den über den Weg instanziierten Instanzen aufrufen ohne Spezialisierung über einen speziellen (zur Compile Zeit schon definierten) TypeCast. Wenn du nun aber die Metaklasse vom Typ TWinControl aufbaust (Class Of TWinControl), dann kennen auch die Instanzen eine Methode Perform ohne Spezialisierung über einen direkten TypeCast. (Ich gehe davon aus, das Perform public ist ab TWinControl - dahingehend habe ich nicht nachgeschaut ob dem so ist).

Im Endeffekt ist es so, das bei allen deinen Beispielen extra dafür Vorkehrungen getroffen wurden damit dies möglich wird, nicht aber in dem Fall wo du die Informationen suchst.

@Maximov: Der o.g. Code sollte beim Aufruf eigentlich gut in die Hose gehen, da die Aufrufparameter fehlen und dadurch der Stack schiefer hängen sollte als der Haussegen.

MfG
Muetze1
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#14

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:46
Zitat von Stevie:
Wenn sie nicht vorhanden sind, ist der Fall klar, dann geht's sowieso nicht. Wenn sie aber in einer Nachfahrenklasse überschrieben wurden, dann kommt diese Methode überhaupt nicht zum Zuge, sondern die in TWinControl. Deshalb das TypeCasting, damit mit der "richtigen" Klasse gearbeitet wird.
Moment. Drehen meine OOP-Kenntnisse jetzt durch oder was ist los? Wozu gibt's Polymorphie? Damit ich einen Basisklassenzeiger (oder halt eine Referenz) wie TWinControl habe, dessen Methode aufrufe und trotzdem die Methode der Klasse, aus der das Objekt letztendlich instanziiert wurde (wie TEdit), ausgeführt wird. Oder nicht? Wo ist das Problem? Es wird doch immer die überschriebene Methode ausgeführt.
Denn du erkennst ja schon, das das nicht funktioniert, wenn die Funktion nicht in der Basisklasse enthalten ist, folglich beziehst du dich schon auf die Polymorphie (denn ohne Polymorphie bist du nicht daran gebunden, was du von wem aufrufst).

Oder ist das jetzt ein Denkfehler meinerseits und du willst was ganz anderes?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#15

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 09:51
So'n Mist!!! Aber danke für die eingehene Erklärung, hab mir das wohl zu einfach vorgestellt.
Aber mal angenommen, eine von TWinControl abgeleitete Klasse hat eine Methode published gemacht, kann ich dann das von maximov gepostete Beispiel anwenden?

Nachtrag:
Tja, ich hab eben gedacht, ich könnte genau sowas wie Polymorphie benutzen, obwohl die Methoden überhaupt als polymorph deklariert sind...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#16

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 10:21
Zitat von Muetze1:
Moin!

...
@Maximov: Der o.g. Code sollte beim Aufruf eigentlich gut in die Hose gehen, da die Aufrufparameter fehlen und dadurch der Stack schiefer hängen sollte als der Haussegen.

MfG
Muetze1
Jeder, der so etwas macht ist selbst dafür verantwortlich, das die methode die richtigen parameter erhält ...is nicht ganz eifach das zur laufzeit zu entscheiden, da keinerlei infos über die signatur der methoden vorliegen, aber wenn man sich ein paar konventionen aufstellt kann man das vertreten.

..

Wie auch immer. Ich würd auch eher auf Polymorphie zurück greifen.
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

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

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 10:33
Zitat von OregonGhost:
Moment. Drehen meine OOP-Kenntnisse jetzt durch oder was ist los? Wozu gibt's Polymorphie? Damit ich einen Basisklassenzeiger (oder halt eine Referenz) wie TWinControl habe, dessen Methode aufrufe und trotzdem die Methode der Klasse, aus der das Objekt letztendlich instanziiert wurde (wie TEdit), ausgeführt wird. Oder nicht? Wo ist das Problem? Es wird doch immer die überschriebene Methode ausgeführt.
...
Oder ist das jetzt ein Denkfehler meinerseits und du willst was ganz anderes?
Letzteres.

Du hast folgendes Problem:
Du hast ein TButton, der aber als TWinControl gecastet ist.
Der Compiler geht also innerhalb der Methode davon aus, das Du nur ein TWinControl hast. Wird in diesem Moment eine Methode aufgerufen wie z.B. Repaint setzt der Compiler die Sprungadresse zu TWinControl.Repaint ein. Da hilft das nichts, das Dein Objekt ein TButton ist und Repaint dortdrin eigentlich überschrieben wäre, da das der Compiler der die Sprungadresse dorthin compiliert nix davon weiss.

Du musst tatsächlich TButton(Object).Repaint aufrufen um die überschriebene Methode zu nehmen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#18

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 10:46
Zitat von Phoenix:
...

Letzteres.

Du hast folgendes Problem:
Du hast ein TButton, der aber als TWinControl gecastet ist.
Der Compiler geht also innerhalb der Methode davon aus, das Du nur ein TWinControl hast. Wird in diesem Moment eine Methode aufgerufen wie z.B. Repaint setzt der Compiler die Sprungadresse zu TWinControl.Repaint ein. Da hilft das nichts, das Dein Objekt ein TButton ist und Repaint dortdrin eigentlich überschrieben wäre, da das der Compiler der die Sprungadresse dorthin compiliert nix davon weiss.

Du musst tatsächlich TButton(Object).Repaint aufrufen um die überschriebene Methode zu nehmen.
Denk da nochmal drüber nach! Entweder hast du dir ein schlechtes beispiel gesucht oder Polymorphy nicht verstanden (nicht böse sein). ABER selbstverständlich wird in diesem fall TButton.Repaint aufgerufen, denn sie wurde ja explizit von TButton überschrieben.

ODer wie darf ich dich verstehen?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#19

Re: Generisches Typecasting?

  Alt 9. Sep 2004, 10:48
Moin!

Nein, da er in die VMT Tabelle ausgehend von der aktuellen Instanzenadresse reinspringt, springt er an die Position der RePaint Procedure die der Button aber in der Instanz mit seiner eigenen Adresse überschrieben hat. Er wird bei dem Vorgehen trotzdem das Repaint des Buttons aufrufen.

Probiere es aus!

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 07:31 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