Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kind as Opa innerhalb der Deklerartion (https://www.delphipraxis.net/139971-kind-opa-innerhalb-der-deklerartion.html)

dmdjt 9. Sep 2009 14:03

Re: Kind as Opa innerhalb der Deklerartion
 
Oja, das hilft!

Und damit hat die Frage sich wirklich ausgezahlt. Auch wenn sie in ihrer Ursprungsform irgendwie nicht so besonders sinnvoll erscheint. (Normal hätte ich einfach bei TVater eine weitere Methode eingeführt und nicht jene von TOpa überschrieben.)

Manche Dinge versteht man erst richtig, wenn man ihre Grenzen findet.

Achja, warum sind die Bezichnungen Opa, Vater und Kind ungünstig gewählt? Dachte nur, dass so der Stammbaum schnell ersichtlich ist. Bin aber was Namensgebung betrifft irgendwie sehr schleißig sollte ich ändern :wink:

Aphton 9. Sep 2009 14:09

Re: Kind as Opa innerhalb der Deklerartion
 
Delphi-Quellcode:
  TOpa = class
  public
    procedure MeinName(); virtual;
  end;

  TVater = class( TOpa )
  public
    procedure MeinName(); override;
  end;

  TKind = class( TVater )
  public
    procedure MeinName(); override;
  end;

...
procedure TForm1.FormCreate(Sender: TObject);
var
  k: TKind;
begin
  k := TKind.Create;
  k.MeinName;
  k.Free;
end;

{ TOpa }
procedure TOpa.MeinName;
begin
  ShowMessage( 'Ich bin dein Opa' );
end;

{ TVater }
procedure TVater.MeinName;
begin
  inherited;
  ShowMessage( 'Ich bin dein Vater, krchh (:D)' );
end;

{ TKind }
procedure TKind.MeinName;
begin
//  inherited;
  asm
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' );
end;

dmdjt 9. Sep 2009 14:17

Re: Kind as Opa innerhalb der Deklerartion
 
Hey, das ist cool und funktioniert!

Wie bist Du auf die Idee gekommen und noch viel wichtiger: Warum geht das mit Inline-Assembler?

Edit:
Okay, ich kanns mir vorstellen warum. Angelegt wird die Methode ja irgendwo. Und mit call springt man halt zu eben jener.

Aphton 9. Sep 2009 14:19

Re: Kind as Opa innerhalb der Deklerartion
 
Wie bin ich auf die Idee gekommen?
Hab einfach das Projekt debuggt, und gesehen, wie ein inherited Aufruf in Assembler aussieht.

Warum funktioniert das?
:firejump:

MfG

sirius 9. Sep 2009 14:23

Re: Kind as Opa innerhalb der Deklerartion
 
@Aphton
Das funktioniert nicht!
Greif mal in TOpa.MeinName auf self zu (Also lass dir irgendein sinnvolles Feld einfallen)!

Ansonsten kannst du auch MeinName als Klassenmethode deklarieren, dann geht es auch ohne ASM.
Edit: Aber eine Klassenmethode ist ja nicht das Ziel.

Edit2: Folgende Änderung:
Delphi-Quellcode:
 TOpa = class
  private
     x:Integer;
  public
    procedure MeinName(); virtual;
  end;

//und:

procedure TOpa.MeinName;
begin
  x:=5;
  ShowMessage( 'Ich bin dein Opa' );
end;

procedure TKind.MeinName;
var i:Integer;
begin
  for i:=0 to 0 do showmessage('Damit es nicht durch Zufall doch klappt');
  asm
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' );
end;

Namenloser 9. Sep 2009 14:23

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von dmdjt
Hey, das ist cool und funktioniert!

Wie bist Du auf die Idee gekommen und noch viel wichtiger: Warum geht das mit Inline-Assembler?

Die Frage ist eher: Geht das auch ohne? Also nur TOpa.MeinName()?

sirius 9. Sep 2009 14:29

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von dmdjt
Mit virtual, abstract usw. (wie heißen diese Schlüsselworte eigentlich?) kenn ich mich nicht mehr besonders gut aus und hab einfach nur herum probiert. Liegt es vielleicht an denen?

Ja.

Aphton 9. Sep 2009 14:29

Re: Kind as Opa innerhalb der Deklerartion
 
Nö, das tut es nicht.
Ich nehme mal an, per Inline Asm ruft man da direkt im Proc-Chain die Methode(Proc/Func) auf,
da ja bei der Vererbung den erbenden Klassen alle Methoden der Parentklasse zur Verfügung stehen.

Aber ich rate nur blöd rum... Deshalb halte ich mich an mein Avater :D

MfG

sirius 9. Sep 2009 14:31

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von NamenLozer
Die Frage ist eher: Geht das auch ohne? Also nur TOpa.MeinName()?

Wie gesagt: Es geht (eigentlich) nicht mal mit. Hier ist es nur Zufall, da self nicht benötigt wird.
Und bei einer Klassenmethode gänge es auch ohne, ja. Aber hier ging es ja um virtuelle Methoden.

Namenloser 9. Sep 2009 14:36

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von sirius
Zitat:

Zitat von NamenLozer
Die Frage ist eher: Geht das auch ohne? Also nur TOpa.MeinName()?

Wie gesagt: Es geht (eigentlich) nicht mal mit. Hier ist es nur Zufall, da self nicht benötigt wird.
Und bei einer Klassenmethode gänge es auch ohne, ja. Aber hier ging es ja um virtuelle Methoden.

Dass es mit einer Klassenmethode geht, ist klar. Was mir jedoch nicht gnaz klar ist, ist wieso der Zurgiff auf self nicht funktioniert: Wenn ich mich nicht irre steht self doch immer im Register EBX, und EBX wurde doch nicht verändert, müsste doch also in TOpa.MeinName immer noch auf das gleiche Objekt verweisen. Löscht call automatisch die Register, oder wie? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz