Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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)

uligerhardt 10. Sep 2009 09:02

Re: Kind as Opa innerhalb der Deklerartion
 
AUA. :wall:

Wenn man sowas braucht, dann stimmt ganz einfach die Klassenhierarchie nicht. Hier gilt halt nicht TSohn is a TVater is a TOpa. Da muss vermutlich irgendwo noch eine vierte Klasse rein, dann kann man sich die Verrenkungen sparen (asm :shock:).

sirius 10. Sep 2009 09:49

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von uligerhardt
Wenn man sowas braucht, dann stimmt ganz einfach die Klassenhierarchie nicht.

Sicher?

Ich habe das auch noch nie gebraucht, aber es ist in mehreren anderen Programmiersprachen möglich. Warum soll denn hier grad Delphi der Maßstab sein (außer, dass wir hier in einem Delphi-Forum sind)? Ich gebe zu, dass mir diesbezüglich theoretisches Wissen fehlt. Ich würde diesen Fakt (da er des öfteren in Delphi-Foren auftaucht) nur mal geklärt wissen. Nicht, dass das einer mal behauptet hat und alle anderen plappern das nur nach.

uligerhardt 10. Sep 2009 11:08

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von sirius
Zitat:

Zitat von uligerhardt
Wenn man sowas braucht, dann stimmt ganz einfach die Klassenhierarchie nicht.

Sicher?

Natürlich nicht, das ist nur ein Bauchgefühl. Allerdings ein ziemlich starkes. :mrgreen:

Zitat:

Zitat von sirius
Ich habe das auch noch nie gebraucht, aber es ist in mehreren anderen Programmiersprachen möglich. Warum soll denn hier grad Delphi der Maßstab sein (außer, dass wir hier in einem Delphi-Forum sind)?

Ich kenn das nur aus C++, wo man TOpa::MeineMethode schreiben kann. Das ist aber vermutlich eher aus Konsistenzgründen so gemacht, weil :: halt nunmal der Scope-Operator ist. Und benenn in C++ mal ne Basisklasse um - toll, wie oft man da AlterKlassenname::Methode durch NeuerKlassenname::Methode ersetzen darf. Deswegen sieht man ja auch oft
Code:
typedef Klassenname inherited; // oder base oder super oder ...
Zitat:

Zitat von sirius
Ich gebe zu, dass mir diesbezüglich theoretisches Wissen fehlt. Ich würde diesen Fakt (da er des öfteren in Delphi-Foren auftaucht) nur mal geklärt wissen. Nicht, dass das einer mal behauptet hat und alle anderen plappern das nur nach.

Ist mir klar, dass ich nicht der erste bin, der die Behauptung äußert. :-D

sirius 10. Sep 2009 12:03

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von uligerhardt
Ich kenn das nur aus C++, wo man TOpa::MeineMethode schreiben kann.

Und in Matlab schreibt man MeineMethode@TOpa, in Java schreibt man super.super ..... :wiejetzt:

uligerhardt 10. Sep 2009 12:24

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von sirius
Zitat:

Zitat von uligerhardt
Ich kenn das nur aus C++, wo man TOpa::MeineMethode schreiben kann.

Und in Matlab schreibt man MeineMethode@TOpa, in Java schreibt man super.super ..... :wiejetzt:

Wie "wie jetzt"? :P Ich kenn von Matlab nur den Namen und Java nur sehr oberflächlich.

Ist aber auch egal, ob's die Sprache freiwillig hergibt oder per Assembler - bevor ich sowas mache, überleg ich mir nochmal, ob meine Klassenhierarchie stimmt. So, meine 2 Cent. :-D

Blup 10. Sep 2009 13:03

Re: Kind as Opa innerhalb der Deklerartion
 
Wenns den unbedingt sein muss ...
Delphi-Quellcode:
type
  TOpa = class(TObject)
  private
    FAlter: Integer;
  public
    procedure SagWas; virtual;
    property Alter: Integer read FAlter write FAlter;
  end;

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

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

  TSagWasProcedure = procedure (Self: Pointer);

procedure TOpa.SagWas;
begin
  showmessage(Format('Opa ist %d Jahre alt.', [Alter]));
end;

procedure TVater.SagWas;
begin
  showmessage(Format('Vater ist %d Jahre alt.', [Alter]));
end;

procedure TKind.SagWas;
var
  Proc: TSagWasProcedure;
begin
//  showmessage(Format('Kind ist %d Jahre alt.', [Alter]));
  Proc := @TOpa.SagWas;
  Proc(Self);
end;

procedure TFTest.Button6Click(Sender: TObject);
var
  K: TKind;
begin
  K := TKind.Create;
  K.Alter := 10;
  K.SagWas;
  K.Free;
end;
gehts auch ohne Assembler.

Aphton 10. Sep 2009 14:06

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von sirius
@Aphton:
Delphi-Quellcode:
procedure TKind.MeinName;
var i:Integer;
    s:string;
begin
  asm
    pushad
  end;
  s:='test';
  for i:=0 to 0 do showmessage('Damit es nicht durch Zufall doch klappt');
  asm
    popad
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' +s);
end;
Aber mach doch, wie ich schon schrieb, ein mov eax,self direkt vor den Aufruf.

Nö - was machst du, wenn die vorigen calls eax modifizieren?
Mit pusad "sichere" ich nur aus sicherheitsgründen die ganzen Register ... Man weiß ja nie, was zwischendrin so alles geschehen kann!

MfG

sirius 10. Sep 2009 14:13

Re: Kind as Opa innerhalb der Deklerartion
 
Zitat:

Zitat von Aphton
Mit pusad "sichere" ich nur aus sicherheitsgründen die ganzen Register ... Man weiß ja nie, was zwischendrin so alles geschehen kann!

Ich weiß, was du beabsichtigst. Aber wenn ich in der Funktion bspw. einen String habe, werden die Register bereits verändert bevor du auch nur etwas retten kannst (nähmlich in begin). Schau dir das Compilat an.
Aber, wie gesagt, es geht mit ASM und ohne ASM, aber nicht ohne Tricksen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 Uhr.
Seite 4 von 4   « Erste     234   

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