Autor |
Beitrag |
king-soft
Hält's aus hier
Beiträge: 11
Win98,2000,XP
Delphi6Pro
|
Verfasst: Di 19.06.07 22:11
Hallo Leute,
ich habe eine Frage zu Methodenaufrufen.
Ich habe in meinem Projekt viele vererbte Formulare:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| TfrmStdVor = class(Tform); Function Korr_Pos(....); TfrmVorAuf = class(TfrmStdVor) Function Korr_Pos(....); TfrmVorArg = class(TfrmStdVor) Function Korr_Pos(....); TfrmVorLS = class(TfrmStdVor)...etc.pp... |
Diese Formulare haben gemeinsame Funktionen/Methoden die normalerweise vom Nachfahr per inherited von "Oben" nach "Unten" aufgerufen werden.
Aber wie kann in aus der Klasse TfrmStdVor die Funktion Korr_Pos(...) aus der Child-Klasse TfrmVorAuf aufrufen?
gibt es ein: Child.Koor_Pos(...) bzw. (der aktullen Instanz einer Klasse sin Nachfahr).Korr_pos(...) oder sowas ähnliches?
Ich weiß nicht mehr weiter; danke für eure Hilfe
Gruß Bernd
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 19.06.07 22:15
Öhm. Wenn Du das tun musst, hast Du irgendwas falsch gemacht. Zeig mal, was Du versuchst, zu machen
Wenn Du sowas willst:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var frmStdVor : frmStdVor; begin frmStdVor := TTfrmVorArg.Create(..); frmStdVor.Korr_Pos(....); /Ruft die Methode von **TTfrmVorArg** auf |
Dann musst Du die Methode in TfrmStdVor als "virtual" deklarieren und in den Nachfahren mit "override" überschreiben.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Di 19.06.07 22:19
Wenn ich dich richtig verstehe, willst du von einem Object eine Methode aufrufen, die eine Unterklasse dieses Objectes hat.
Das geht nicht!!!
Vererbung funktioniert nur von oben nach unten d.h. Unterklassen besitzen (mit Einschränkungen) die Methoden der jeweiligen Oberklasse, deine Klasse TfrmStdVor hat/kennt die Methode Korr_Pos(...) einfach nicht.
Was du aber machen kannst ist in einer einer Variablen deiner Oberklasse
Delphi-Quelltext
durch
Delphi-Quelltext 1:
| form:=TfrmVorAuf.create; |
ein Object der Unterklasse zu erzeugen, dieses würde dann die Methode Korr_Pos(...) kennen.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 19.06.07 23:20
Also ich würde die Methode in der Basisklasse als 'Virtual' deklarieren. Die Kindklassen überschreiben (override) die Methode.
Wenn Du dann in der Basisklasse die Methode aufrufst, wird automatisch die richtige Methode der Kindklasse aufgerufen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| Type TBasisklasse = Class Procedure Foo; Virtual; Procedure Bar; End;
TKindKlasse = Class (TBasisklasse) Procedure Foo; Override; End;
TNeAndereKindKlasse = Class (TBasisklasse) Procedure Foo; Override; End;
Procedure TBasisKlasse.Foo; Begin ... End;
Procedure TBasisKlasse.Bar; Begin Foo; End; |
_________________ Na denn, dann. Bis dann, denn.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 20.06.07 02:25
Erkläre mal, wie das konkret realisiert wird :
king-soft hat folgendes geschrieben: | Hallo Leute,
Ich habe in meinem Projekt viele vererbte Formulare:
...
Diese Formulare haben gemeinsame Funktionen/Methoden die normalerweise vom Nachfahr per inherited von "Oben" nach "Unten" aufgerufen werden.
Moderiert von Christian S.: Delphi-Tags hinzugefügt |
Zeige mal die PAS und vor allem auch die zugehörige DFM. Letztere ist wichtig ! Weitere Frage : ist die Objektablage/Reopsitory ein Begriff oder wird alles von Hand erledigt (bzw. das versucht) ?
_________________ Gruß
Hansa
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 20.06.07 04:07
alzaimar hat recht.
Wenn Du ein Object vom Typ B erstelltst, welches eine Methode seines Vorfahren überschreibt, kann auch im Code des Vorfahren diese Methode aufgerufen werden und der Code des Nachfahren wird ausgeführt, da auf dem VMT (Virtual Method table) die Methode des Nachfahren ganz oben liegt. Bei virtuellen methoden wird immer über den VMT auf eine Methode zugegriffen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
king-soft 
Hält's aus hier
Beiträge: 11
Win98,2000,XP
Delphi6Pro
|
Verfasst: Mo 25.06.07 18:40
Titel: Danke
Hallo Leute,
vielen Dank erstmal für eure Antworten.
Ich kann bestätigen dass alzaimar recht hat !
Wenn man in vererbten Strukturen/Formularen in der Basisklasse die benötigten Methoden als 'Virtual' deklariert, und in der Kindklassen diese Methode mit override deklariert wird aus einer Methode der Basisklasse automatisch die richtige Methode der Kindklasse aufgerufen. Delphi ist genial (Ihr natürlich auch).
Also danke nochmal, funzt.
Gruß Bernd
PS. Ich konnte übrigens solange nicht Antworten weil ich normalerweise mit Firefox arbeite, und der mich einfach nicht einloggen lässt. Zufälligerweise mal mit IE ausbprobiert, und wie man sieht klapps auch mit dem Nachbarn.
Die Mailadresse an die man sich dann wenden kann klappt auch nicht:
----- The following addresses had permanent fatal errors -----
<info@entwickler-ecke.de>
(reason: 550 host entwickler-ecke.de [81.169.132.68] said: 550 <info@entwickler-ecke.de>: User unknown in virtual alias table)
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 25.06.07 18:50
Titel: Re: Danke
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 25.06.07 18:57
Titel: Re: Danke
_________________ Na denn, dann. Bis dann, denn.
|
|
king-soft 
Hält's aus hier
Beiträge: 11
Win98,2000,XP
Delphi6Pro
|
Verfasst: Mo 25.06.07 19:06
Titel: Re: Danke
Hallo Christian,
Asche auf mein Haupt. Jetzt wo du es sagt lese ich es in DEINER Antwort. (und dann noch innerhalb von 4 Minuten!!!)
Sorry, du warst tatsächlich der Erste mit der richtigen Antwort. Da in der zwischenzeit schon soviele Antworten da waren, muß ich deinen letzten Satz übersehen haben.
Ich gelobe Besserung.
Danke nochmals.
Gruß Bernd
|
|
king-soft 
Hält's aus hier
Beiträge: 11
Win98,2000,XP
Delphi6Pro
|
Verfasst: Mo 25.06.07 19:09
Titel: Re: Danke
Hallo Christian,
Asche auf mein Haupt. Jetzt wo du es sagt lese ich es in DEINER Antwort. (und dann noch innerhalb von 4 Minuten!!!)
Sorry, du warst tatsächlich der Erste mit der richtigen Antwort. Da in der zwischenzeit schon soviele Antworten da waren, muß ich deinen letzten Satz übersehen haben.
Ich gelobe Besserung.
Danke nochmals.
Gruß Bernd
|
|