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 1 von 4  1 23     Letzte »    
dmdjt

Registriert seit: 18. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#1

Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 12:26
Gibt es eine Möglichkeit eine Methode von Großvater bis Kind zu vererben... allerdings beim Kind die Methode vom Großvater direkt aufzurufen?

Hört sich vielleicht etwas konfus an, also hier der Code wie ich es gerne hätte:

Delphi-Quellcode:
procedure TOpa.tuwas;
begin
  showmessage('Opa');
end;


procedure TVater.tuwas;
begin
  showmessage('Vater');
end;

procedure TKind.tuwas;
begin
 (self as TOpa).tuwas;
end;
Also bei mir kommt dann ein StackOverflow. Das würde ich gerne besser verstehen. Erwartet hätte ich vielleicht eine Zugriffsverletzung oder was anderes... aber StackOverflow verweundert mich schon ein wenig.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 12:58
Hallo,

sag mal wie die Klassenherachie aufgebaut ist?
Wie ist tuwas Deklariert (in der abstrakten Basis-Klasse)?
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Namenloser

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

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:06
Zitat von dmdjt:
Also bei mir kommt dann ein StackOverflow. Das würde ich gerne besser verstehen. Erwartet hätte ich vielleicht eine Zugriffsverletzung oder was anderes... aber StackOverflow verweundert mich schon ein wenig.
Das macht schon Sinn, wenn du die Prozedur TuWas in der Basisklasse als virtual, und inder abgeleiteten als override deklariert hast. Override bewirkt, dass alle Aufrufe dieser Funktion, sowohl aus der abgeleiteten Klasse, als auch aus der Basisklasse auf die neue Version umgeleitet werden. Die Funktion ruft sich also imemr wieder selbst auf, bis der Stack voll ist.

Eine Möglichkeit die Funktion des Opas aufzurufen kenne ich nicht. Wenn es nur um den Vater ginge, ginge es mit inherited.
  Mit Zitat antworten Zitat
dmdjt

Registriert seit: 18. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:17
Der sohn ist vom Vater und der Vater vom Opa abgeleitet. Das ganze soll nur ein Beispiel sein und die Methode TuWas gibt nur eine MessageBox mit entweder dem Text 'Opa' (TOpa) oder 'Vater' (TVater) aus. Bei TKind sollte allerdings wieder 'Opa' ausgegeben werden.

procedure Tuwas; ist public deklariert

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?

Anwendungsbeispiele fallen mir momentan keine ein. Ich habe die Frage nur irgendwo einmal gelesen und dachte, dass man das vielleicht so implementieren könnte. Ich versuche mir OOP nach längerer Abstinz wieder besser ins Gehirn zu hämmern. Was gar nicht so leicht ist, weil mein bisheriges Wissen ein zur Hälfte vergessenes Halbwissen ist.



Der Fehler tritt auch ohne override auf. Egal als was ich die Methode deklariere.

Edit: Wo bleiben meine Marnieren... Herzlichen Dank natürlich!!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:26
Hi,

Ich weiß nicht ob das geht.. entspricht evtl auch nicht dem Grundgedanken von OOP. Aber du könntest versuchen:

Delphi-Quellcode:
procedure TKind.tuwas;
begin
 inherited (inherited tuwas);
end;
weiß allerdings nicht ob man inherited doppelt verwenden kann....
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#6

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:31
Auch bei TOpa(Kind).tuwas wird immer die überschiebene Methode aufgerufen, welche sich auf diesem Wege selber aufruft -> StackOverflow.
Mit "inherited" kommt man nur bis zu TVater zurück. Da bestände dann die Möglichkeit für "Sauereien" ala
Delphi-Quellcode:
if (Self is TKind) then
  inherited
else
  ShowMessage('Vater');
Damit ruft ein inherited-Aufruf vom Kind über den Vater - Umweg die Opa-Methode auf. Nicht zu empfehlen da unübersichtlich und unflexibel.

Die Möglichkeit das ganze zu umgehen wäre das verdecken der virtuellen Methode von TOpa (-> reintroduce. Dadurch existieren die Methoden dann "nebeneinander" und der Aufruf gelingt.

MfG,
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#7

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:32
Im Zweifelsfall musst du eben ein Parent-Feld einführen (und beim Create richtig belegen).

Sowas wie self.parent.parent.TuWas sollte auf jeden Fall gehen
  Mit Zitat antworten Zitat
dmdjt

Registriert seit: 18. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:43
Delphi-Quellcode:
procedure TKind.tuwas;
begin
inherited (inherited tuwas);
end;
Geht leider nicht...zumindest nicht in der Form: Missing Operator or semicolon.

Ihr habts einen Haufen interessanter Ideen!

Vielen Dank an euch alle!
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#9

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:47
Zitat von Meflin:
Sowas wie self.parent.parent.TuWas sollte auf jeden Fall gehen
Wobei das dann nur funktioniert wenn auch eine Instanz von TOpa existiert. Ich denke mal hier geht es eher ums Klassendesign. Die Bezeichnungen Kind/Vater/Opa sind nur etwas ungünstig gewählt.

Der richtige Weg wäre wohl eher eine Methode nicht so zu überschreiben das sie in der nachfolgenden Klasse nicht zu gebrauchen ist, oder noch besser auch TKind von TOpa abzuleiten.

MfG,
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:52
Ich musste es mir auch erst wieder klar machen, aber es ist wie alle es sagen

StackOverflow ist klar weil:

Wenn du eine Klasse erstellst, werden ja alle Speicherbereich erstellt die so benötigt werden und eben auch die Ein-Sprungpunkte der Methoden der Klasse. Das Ermöglicht ja das LateBinding / SpäteBindung. D.h. erstmal das ja zum Zeitpunkt das Programmschreibens noch nicht klar ist, welche Methoden tatsächlich aufgerufen werden.
Delphi-Quellcode:
var Person: TPerson;
//...
procedure TForm1.Button1Click(Sender: TObject);
begin
  Person.Tuwas;
end;
wird jetzt in Button2click ein Kind erstellt mit
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Person := TKind.Create;
end;
muss ja irgend etwas dafür sorgen, dass bei Button1Click die richtige Methode aufgerufen wird. Wenn du also den Contructor von TKind aufrufst, wird eine Klasse erstellt die Identisch zu TPerson ist und als Einsprungpunkt für TuWas immer die Methode von TKind.Tuwas hat.

Dieser Mechanismus erzeugt jetzt den Stackoverflow, denn egal welchen Typcast du auf Person außerhalb der Klassen anwendest - es wird immer TKind.Tuwas aufgerufen aufgrund des Einsprungpunktes. Das selbe gilt natürlich für innerhalb der Klassen.

Somit kommt es in dein ursprünglicher Aufruf von (Self as TOpa).Tuwas zum Stackoverflow. Es ergibt sich eine Rekursion unendlicher Tiefe und der Stack läuft über wegen der Rücksprungadressen etc.

Ich hoffe das hilft dir etwas beim Verständnis.

Gruß, Chris

[EDIT] 2x Button1Click [/EDIT]
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 09:45 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