Einzelnen Beitrag anzeigen

scouty

Registriert seit: 27. Nov 2003
Ort: Dresden
47 Beiträge
 
#7

Re: Methodenhierarchie in der Vererbung umgehen/überspringen

  Alt 12. Jan 2004, 14:53
Ich fürchte, wir reden hier etwas aneinander vorbei. Also, kann zwar leidlich programmieren, aber ich bin kein richtiger Programmierer oder Informatiker. Meine Kenntnisse über OOP gehen nicht sehr tief. Daher sagten mir die von Dir genannten Muster erstmal gar nix. Ich habe mich jedoch gerade informiert und werde mich demnächst mit diesen Muster beschäftigen. Vielen Dank erstmal für die Anregung.

Nun zu meinem konkretem Problem. Ich geh’, mal davon aus, da zum einem Delphi keinen Hierarchiesprung vorsieht und aufgrund der Reaktion zu meinem Thread, dass solcher Art Hierarchiesprünge (das Umgehen einer Methode in der Vaterklasse, indem man die Methode direkt beim Großvater aufruft) in OOP generell nicht vorgesehen/erwünscht sind. Das heißt, dass man die Objektstruktur von vornherein so entwerfen sollte, dass solche Probleme gar nicht auftreten. Bei mir ist dieses Problem doch schon des Öfteren aufgetreten, ich habe es dann jedes Mal mehr elegant oder weniger elegant lösen können.

Die aktuelle Version ist folgende:

Ich habe ein Formular TDBEdtFrm, welches von TBscFrm erbt und auf TDBEdtFrmChild erweitert wird (TBscFrm < TDBEdtFrm < TDBEdtFrmChild).

TBscFrm enthält die Grundformen einer Hauptformularsteuerung wie Anwendung schließen, Neue Anwendung usw. Wird hier die Methode Close() aktiviert, so führt diese nur grundlegende Operationen aus, die bei allen Anwendungen gleich sind: Wie z.B. Abfrage, ob wirklich geschlossen werden soll und die visuellen Änderungen am Hauptformular.

TDBEdtFrm ist ein Formular, welches zum Bearbeiten einer DB-Datenbank eingesetzt werden kann. Wenn hier die Methode Close() aufgerufen wird, dann schließt diese u.a. alle offenen Datenressourcen und ruft dann Close() bei der Superklasse auf.

TDBEdtFrmChild erweitert TDBEdtFrm, damit diese als MDIChild in einer MDI-Anwendung eingesetzt werden kann. Wird hier jedoch die Methode Close() aufgerufen, so darf diese nicht die Ressourcen schließen, da diese ja noch von anderen MDIChilds der Anwendung verwendet werden. Folglich darf die Methode Close() von TDBEdtFrm nicht aufgerufen werden. Mir wäre es daher am liebsten gewesen, hier meine eigene Methode Close() zu schreiben, die hier ihre Routine für das Formular TDBEdtFrmChild ausführt und dann den Rest wieder an die übergeordnete Methode von TBscFrm übergibt, dabei aber Close() in TDBEdtFrm übergeht.


Ich hoffe, mir ist es gelungen, hier mein kleines Problem kurz aber auch verständlich darzustellen. Also, ich habe es zumindest verstanden, sogar besser als zuvor; denn als ich das hier schrieb, kam mir die Idee einfach die Vererbungshierarchie zu ändern (TBscFrm < TDBEdtFrmChild < TDBEdtFrm), das könnte zumindest auf den ersten Blick dieses Problem lösen oder besser gesagt vermeiden. Während TDBEdtFrmChild lediglich als MDIChild verwendet werden soll, soll TDBEdtFrm das Hauptformular einer eigenen Anwendung bilden, folglich ist der Funktionsumfang hier höher. Es wäre daher wohl besser TDBEdtFrm als eine Erweiterung von TDBEdtFrmChild zu programmieren. Jedenfalls sind das so die Probleme, mit denen ich mich so rumschlagen muss ;o))

Vielen Dank für Eure Antworten zu diesem Thread

Greetings Scouty
  Mit Zitat antworten Zitat