AGB  ·  Datenschutz  ·  Impressum  







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

virtuelle Methode "nicht" überschreiben

Ein Thema von himitsu · begonnen am 27. Jan 2011 · letzter Beitrag vom 29. Jan 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.782 Beiträge
 
Delphi 12 Athens
 
#1

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 19:39
In meinem Fall war es einfach ein virtueller Constructor, wobei das auf alle virtuellen Methoden angewendet werden kann.

Es gibt eine Klasse, welche von einer anderen Klasse abgeleitet ist.
Nun ist hier ein neuer Contructor eingeführt, mit weiteren Parametern und es ist vorgesehen, daß weitere Nachfahren diesen neuen Contructor verwenden.
Intern wird der alte Contructor auf den neuen umgeleitet.

Nun ist es aber vorgesehen, daß diese Klasse öfters erweitert/abgeleitet wird und dabei soll einfach vermieden werden, daß die beiden Constructoren abwechseln überschrieben werden, was zur Folge hat, daß die Aufrufreihenfolge nicht mehr stimmt.

Delphi-Quellcode:
TMyClass0 = class()
  procedure MethodA; virtual;
end;

TMyClass1 = class(TMyClass0)
  procedure MethodA; overload;
  procedure MethodB; virtual;
end;

TMyClass2 = class(TMyClass1)
  procedure MethodB; overload;
end;

TMyClass3 = class(TMyClass2)
  procedure MethodA; overload;
  // eigentlich nicht "erlaubt", da es in MethodB gehören würde
end;

TMyClass4 = class(TMyClass3)
  procedure MethodB; overload;
end;



procedure TMyClass1.MethodA;
begin
  MethodB;
end;

procedure TMyClass1.MethodB;
begin
  inherited MethodA;
end;

// und sonst jeweils inherited auf den eigenen Vorfahren
TMyClass1 ist meine Klasse, auf TMyClass0 hab ich keinen Einfluß und das ab TMyClass2 unterliegt auch nicht unbedingt meiner Kontrolle.

Ruft man jetzt MethodB auf, dann würden die Methoden in dieser Reihenfolge ausgeführt:

TMyClass4.MethodB
TMyClass2.MethodB
TMyClass3.MethodA
TMyClass1.MethodA
TMyClass0.MethodA

Wie man sieht ist 2 und 3 vertauscht.
Darum einfach die alte Methode für's Überschreiben sperren, damit man das nicht ausversehn macht.


Grund ist einfach, daß die Komponente für billiges GUI-Geklicke mit Einstellung über den OI
und für die direkte Verwendung im Code, über Parameter im Contructor, verwendet werden kann.
Wobei im Code, mit dem dem alten Constructor und über Property auch möglich wäre.


PS: sealed macht sich gut, wenn man eine öfentliche Klasse hat, von welcher aber nicht abgeleitet werden soll und die sich leider nicht privat deklarieren läßt, da man sie selber in mehreren Units benötigt.


PSS: Man hätte statt dem final die Methode einfach mit einer Nichtvirtuellen verdecken können, aber so ist es sauberer.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (27. Jan 2011 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: virtuelle Methode "nicht" überschreiben

  Alt 28. Jan 2011, 11:54
Zitat:
PSS: Man hätte statt dem final die Methode einfach mit einer Nichtvirtuellen verdecken können, aber so ist es sauberer.
Das auf jeden Fall. Zumal verdecken überhaupt nichts bringt wenn Vererbung im Spiel ist und man die Klasseninstanz über die Basisklasse ansteuert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


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:14 Uhr.
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