Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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