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.184 Beiträge
 
Delphi 12 Athens
 
#1

virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 10:21
Delphi-Version: XE
Moin,

sag mal, gibt es in Delphi XE eigentlich die Möglichkeit, um zu sagen daß eine virtuelle Methode ab jetzt nicht mehr überschieben werden darf, also in den Nachkommen meiner Klasse?

[add]
Mir ist grad eingefallen, daß ich eventuell notfalls zur Laufzeit den in meiner Methode prüfen kann, ob dieses in der aktuellen VMT unverändert ist.
$2B or not $2B

Geändert von himitsu (27. Jan 2011 um 10:25 Uhr)
  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
 
#2

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 10:22
Hallo,

Delphi-Quellcode:
type
  TA = class
    procedure ABC; virtual;
  end;

  TB = class(TA)
    procedure ABC; override; final;
  end;

  TC = class(TB)
    procedure ABC; override; // [DCC Fehler] Unit1.pas(33): E2352 Eine final-Methode darf nicht überschrieben werden
  end;
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
Benutzerbild von himitsu
himitsu

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

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 10:26
Danke

Mir war auch so, als wenn ich da mal irgendwann irgendwas gesehn hatte.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 19:24
Für was braucht man so etwas in der Praxis? Spontan würde mir kein Grund einfallen ein überschreiben einer virtuellen Methode verhindern zu wollen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 19:31
Für was braucht man so etwas in der Praxis? Spontan würde mir kein Grund einfallen ein überschreiben einer virtuellen Methode verhindern zu wollen.
Das frage ich mich auch jedesmal, wenn ich über final oder sealed stolpere. Nachdem es aber alle "neuen" Programmiersprachen haben, war es offenbar überfällig, sowas zu efinden.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: virtuelle Methode "nicht" überschreiben

  Alt 27. Jan 2011, 20: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.
$2B or not $2B

Geändert von himitsu (27. Jan 2011 um 20: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
 
#7

AW: virtuelle Methode "nicht" überschreiben

  Alt 28. Jan 2011, 12: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
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

AW: virtuelle Methode "nicht" überschreiben

  Alt 29. Jan 2011, 10:16
Für was braucht man so etwas in der Praxis? Spontan würde mir kein Grund einfallen ein überschreiben einer virtuellen Methode verhindern zu wollen.
Joshua Bloch (Author von "Effective Java") empfiehlt, final mmer dann zu verwenden, wenn eine Klasse oder Methode nicht für Erweiterungen entworfen wurde. Einige Beiträge auf Stack Overflow nennen API Design als Haupteinsatzgebiet für final deklarierte Klassen und Methoden. Man kann das auf Delphi auch anwenden - es schadet nicht, den anderen Entwicklern explizit zu zeigen, welche der Methoden man für Erweiterbarkeit entworfen hat und welche nicht.
Michael Justin
habarisoft.com
  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 02: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