AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kind as Opa innerhalb der Deklerartion

Ein Thema von dmdjt · begonnen am 9. Sep 2009 · letzter Beitrag vom 10. Sep 2009
Antwort Antwort
Seite 3 von 4     123 4      
dmdjt

Registriert seit: 19. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#21

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 15:40
Habs getestet mit

Delphi-Quellcode:
TOpa = class
public
  alter : integer;
  procedure tuwas;
end;


procedure TOpa.tuwas;
begin
  showmessage('Großvater '+inttostr(self.alter));
end;
Opa, Vater und Kind haben ein Unterschiedliches Alter. Wenn Alter eine Konstante ist geht es. Wenn nicht, dann ist Alter = 0. Das ist mir klar. Und natürlich die Limitation an dem ganzen. Wird ja nirgendwo zugewiesen. Und wenn dann würde es auch nix bringen, weil man ja auf die KLasse und nicht auf das Objekt zugreift. Hab ich das richtig verstanden?

PS: Bin mal für einige Zeit weg...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 15:44
Zitat von NamenLozer:
Löscht call automatisch die Register, oder wie?
Nein, aber vor dem Call kann ja noch etwas stehen. Wenn nicht, dann passiert auch nix. Aber schon allein das Nutzen von dynamischen (Interface, String, dyn. Array) Variablen verändert ne Menge Register bevor deine Methode richtig anfängt.
Edit: Ein mov eax,self dürfte allerindg schon reichen. Das sind aber reichlich Verrenkungen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#23

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 15:45
Hallo,

abgesehen von möglichen Designfehlern in der Klassenhierarchie - wäre es nicht am einfachsten, dem fleißigen Opa eine weitere, nicht-virtuelle Methode zu spendieren?

Delphi-Quellcode:
type
  TOpa = class
    procedure TuWas; virtual;
    procedure OpaTutWas;
  end;

procedure TOpa.TuWas;
begin
  OpaTutWas;
end;

procedure TOpa.OpaTutWas;
begin
  // die eigentlichen Aktionen
end;

[...]

procedure TKind.TuWas;
begin
  OpaTutWas;
end;
Die neue Methode kann in allen abgeleiteten Klassen direkt aufgerufen werden.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:41
Die Methode von Hawkeye219 funktioniert zwar,

aber wenn jetzt TOpa eine Klasse aus Delphi wie TMemo u.a. wäre, könnte man nicht
einfach die Source ändern .

Aber ich bin auch darauf gespannt, ob so was mit asm möglich ist.

ALso so inetwa wie das hier:

Delphi-Quellcode:
asm
  mov eax, self;
  call TOpa.MeinName;
end;
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:44
Zitat von olee:
Aber ich bin auch darauf gespannt, ob so was mit asm möglich ist.
List hier eigentlich noch jemand ALLE bisherigen Kommentare?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:45
Delphi-Quellcode:
procedure TKind.MeinName;
var i:Integer;
begin
  asm
    pushad
  end;
  for i:=0 to 0 do showmessage('Damit es nicht durch Zufall doch klappt');
  asm
    popad
    call TOpa.MeinName
  end;
  ShowMessage( '(Kind:) a gugugugu' );
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#27

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:46
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#28

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:58
Zitat von olee:
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

Muss eigentlich. Allerdings steht self höchstwahrscheinlich nicht in EAX, denn EAX ist für den Funktionsrückgabewert reserviert.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#29

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 16:59
Zitat von olee:
Ich hab alles gelesen meine Frage war, ob durch dieses MOV danach auch die
Varaible self in TOpa.TuWas zu gebrauchen ist.

Ja, ist es, siehe Beitrag #22
Edit: Sorry, den hatte ich editiert....


@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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#30

Re: Kind as Opa innerhalb der Deklerartion

  Alt 10. Sep 2009, 09:38
Etwas gekünstelt könnte man es so machen:

Delphi-Quellcode:
interface

type
  TOpa = class (TObject)
  public
    procedure SachWas (ARecurse : Integer = 0); virtual;
  end;

  TVater = class (TOpa)
  public
    procedure SachWas (ARecurse : Integer = 0); override;
  end;

  TSohn = class (TVater)
  public
    procedure SachWas (ARecurse : Integer = 0); override;
  end;

implementation

{ TOpa }

procedure TOpa.SachWas (ARecurse: Integer = 0);
begin
  ShowMessage ('Hallo Jungs!')
end;

{ TVater }

procedure TVater.SachWas (ARecurse: Integer = 0);
begin
  if ARecurse > 0 then
    inherited SachWas (ARecurse - 1)
  else
    ShowMessage ('Hallo Bub!')
end;

{ TSohn }

procedure TSohn.SachWas (ARecurse: Integer = 0);
begin
  if ARecurse > 0 then
    inherited SachWas (ARecurse - 1)
  else
    ShowMessage ('GuGu!')
end;

procedure AlleSagenWas(Sender: TObject);
var
  kind : TSohn;
begin
  kind := TSohn.Create;
  try
    kind.SachWas;
    kind.SachWas(1);
    kind.SachWas(2);
  finally
    kind.Free;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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