Wie Greife ich auf Methode der Vor vor gänger klasse zu ?
Hi Leuts,
Habe folgenden Code :
Delphi-Quellcode:
und beim Ausprogrammieren mache ich nun
Type
a = Class Procedure d;virtual; end; b = Class(a) Procedure d;override; end; c = Class(b) Procedure d;override; end;
Delphi-Quellcode:
Die Procedur c.d würde nun b.d aufrufen.
Procedure c.d;
begin inherited d; end; Was aber, wenn ich das nicht will, sondern ich eigentlich a.d aufrufen wollte ohne b.d bisher muste ich immer her gehen und den Inherited Teil Löschen und den Code von a.d rauskopieren und dann bei c.d einfügen. Aber das mus doch auch besser gehn, oder ? |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Ich glaube nicht, dass du die vererbte Methode der vererbten Methode aufrufen kannst. Ich kann mir auch keine Anwendung dafür vorstellen, zumindest hatte ich noch nie eine.
Ein Workaround wäre, die Methode in der a oder in der b anders zu nennen. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Ein solches Konstrukt würde auch dem sinn der OOP widersprechen, da hier die Wahrscheinlichkeit groß ist, daß IS_A Beziehung verletzt wird.
|
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Ich habe das andauernd
wer mein Speil Balanced kennt. Da gibt es sehr ähnliche Elemente. D.h ich habe z.b. einen Stein gemacht der hat 1 bewegliches und mehrere Starre Objecte nun teilen die sich eine sehr Komplexe Datenstruktur. und diese Struktur mus ich dann drehen können. Das Prob ist nu wenn ich nun mehrere solche Objecte hintereinander Ableite und das Letze dann drehen mus wäre es cool wenn das die Rot function der Ursprünglich Klasse aufruft und nicht das der Vorgängerklasse da die dann nicht mehr geht. Ich habe übrigens schon ne Lösung so ist das nicht, aber die ist etwas zu Kompliziert :
Delphi-Quellcode:
@mkinzler
type
a =Class published procedure d;virtual; end; b =Class(a) procedure d;Override; end; C =Class(b) procedure d;Override; end; var Form1: TForm1; implementation {$R *.dfm} Procedure A.d; begin showmessage('A'); end; Procedure B.d; begin Showmessage('B'); end; Procedure C.d; type TExecute = Procedure of Object; var P : TMethod; E : TExecute; begin P.Data := Self; P.Code := A.MethodAddress('d'); if Assigned(P.Code) then begin try E := TExecute(P); E; //call method except end; end; end; procedure TForm1.FormCreate(Sender: TObject); var aC : C; begin aC := C.Create; aC.D; halt; end; IN java geht sowas anscheinend Problemlos |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
- du könntest es mit
Delphi-Quellcode:
versuchen.
(self as <Klasse>).<Methode>
Aber wie gesagt stimmt dann das Vererbungsschema nicht, wenn soetwas notwendig wird. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Cool es geht.
THX. Was die Vererbungsreihenfolge angeht. So bin ich mir da nicht sicher ob das unbedingt falsch sein mus. Man stelle sich vor. Ich habe eine Klasse A Leite die in B ab Erweitere b um sehr viel Leite B in C ab und will in C alles was b hat auser eben eines speziellen Features das Blöderweise in A ist und aber von B überschrieben wird. und diese Aktion die ich hier versuche , passiert nur asu der Faulheit B wieder mit altem Code zu überschrieben. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Zitat:
Der Upcast hilft da IMHO auch nichts. Sollte es doch funktionieren, habe ich wohl bei der Programmieren I-Vorlesung doch zu viel Tetris gespielt. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Es besteht natürlich ein unterschied zwischen Theorie und Praxis.
|
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Das heißt?
|
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Zitat:
Ein Klassenschema, daß der reinen Theroie widerspricht kann in der Praxis u.U. trotzdem bestehen. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
dh. das dein Vorschlag
Delphi-Quellcode:
nicht mit virtuellen noch dynamischen Methoden funktioniert. Unabhängig von der Klasse nach der man castet wird denoch die Ontop Methode aufgerufen.
(self as <Klasse>).<Methode>
Zitat:
Gruß Hagen |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Zitat:
Dann erben B und C von D. B überschreibt das Feature, C nicht. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Ich selbst ging ja davon aus das es nicht geht.
Also ich habe mal Folgendes Gekodet :
Delphi-Quellcode:
Was passiert wenn ich auf den Button drücke ist ein Stack overflow => es geht nicht.
Unit Unit1;
Interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Type TForm1 = Class(TForm) Button1: TButton; Procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } End; a = Class Procedure d; End; b = Class(a) Procedure d; End; c = Class(b) Procedure d; End; Var Form1: TForm1; Implementation {$R *.DFM} Procedure a.d; Begin showmessage('a'); End; Procedure b.d; Begin showmessage('b'); End; Procedure c.d; Begin (self As a).d; End; Procedure TForm1.Button1Click(Sender: TObject); Var z: c; Begin z := c.create; z.d; z.free; End; End. |
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Hmm, du wolltest die Methoden auch wirklich verstecken bzw. reimplementieren anstatt zu überschreiben?
|
Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
Ups
Delphi-Quellcode:
war eigentlich so gemeint.
a = Class
Procedure d; virtual; End; b = Class(a) Procedure d; override; End; c = Class(b) Procedure d; override; End; Der effeckt bleibt aber der selbe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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