Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Wie Greife ich auf Methode der Vor vor gänger klasse zu ? (https://www.delphipraxis.net/79291-wie-greife-ich-auf-methode-der-vor-vor-gaenger-klasse-zu.html)

Corpsman 19. Okt 2006 20:56


Wie Greife ich auf Methode der Vor vor gänger klasse zu ?
 
Hi Leuts,

Habe folgenden Code :

Delphi-Quellcode:
Type
  a = Class
   Procedure d;virtual;
  end;
  b = Class(a)
   Procedure d;override;
  end;
  c = Class(b)
   Procedure d;override;
  end;
und beim Ausprogrammieren mache ich nun

Delphi-Quellcode:
Procedure c.d;
begin
  inherited d;
end;
Die Procedur c.d würde nun b.d aufrufen.

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 ?

3_of_8 19. Okt 2006 20:58

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.

mkinzler 19. Okt 2006 21:00

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.

Corpsman 19. Okt 2006 21:06

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:
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;
@mkinzler

IN java geht sowas anscheinend Problemlos

mkinzler 19. Okt 2006 21:10

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
- du könntest es mit
Delphi-Quellcode:
(self as <Klasse>).<Methode>
versuchen.
Aber wie gesagt stimmt dann das Vererbungsschema nicht, wenn soetwas notwendig wird.

Corpsman 19. Okt 2006 21:17

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.

3_of_8 19. Okt 2006 21:22

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Zitat:

Zitat von mkinzler
- du könntest es mit
Delphi-Quellcode:
(self as <Klasse>).<Methode>
versuchen.
Aber wie gesagt stimmt dann das Vererbungsschema nicht, wenn soetwas notwendig wird.

Ich kann mir nicht vorstellen, dass das funktioniert, nämlich aufgrund des Prinzips der dynamischen Methodenbindung.

Der Upcast hilft da IMHO auch nichts. Sollte es doch funktionieren, habe ich wohl bei der Programmieren I-Vorlesung doch zu viel Tetris gespielt.

mkinzler 19. Okt 2006 21:26

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Es besteht natürlich ein unterschied zwischen Theorie und Praxis.

3_of_8 19. Okt 2006 21:31

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Das heißt?

mkinzler 19. Okt 2006 21:37

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Zitat:

Zitat von 3_of_8
Das heißt?

Das bezog sich auf #6:
Ein Klassenschema, daß der reinen Theroie widerspricht kann in der Praxis u.U. trotzdem bestehen.

negaH 20. Okt 2006 06:36

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
dh. das dein Vorschlag

Delphi-Quellcode:
(self as <Klasse>).<Methode>
nicht mit virtuellen noch dynamischen Methoden funktioniert. Unabhängig von der Klasse nach der man castet wird denoch die Ontop Methode aufgerufen.

Zitat:

Zitat von Manuel
Der Upcast hilft da IMHO auch nichts. Sollte es doch funktionieren, habe ich wohl bei der Programmieren I-Vorlesung doch zu viel Tetris gespielt.

Du hast nicht zuviel Tetris gespielt.

Gruß Hagen

Sidorion 20. Okt 2006 08:29

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Zitat:

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.
dann mach Dir einen 'abstrakten Vorgänger' D, der alles, was B überschteibt überschreibt, ausser das Feature, das C haben will.
Dann erben B und C von D. B überschreibt das Feature, C nicht.

Corpsman 20. Okt 2006 13:58

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:
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.
Was passiert wenn ich auf den Button drücke ist ein Stack overflow => es geht nicht.

Muetze1 20. Okt 2006 14:14

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?

Corpsman 20. Okt 2006 14:23

Re: Wie Greife ich auf Methode der Vor vor gänger klasse zu
 
Ups

Delphi-Quellcode:
a = Class
    Procedure d; virtual;
  End;

  b = Class(a)
    Procedure d; override;
  End;

  c = Class(b)
    Procedure d; override;
  End;
war eigentlich so gemeint.

Der effeckt bleibt aber der selbe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 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