![]() |
Warum kann man Vererbung verhindern (csInheritable)?
Hallo,
ich habe mal eine grundsätzliche Frage: Warum ist es möglich zu verhindern, dass ein Formular abgeleitet werden kann? Aber nun das Ganze im Detail (am Beisp. von D7):
Mit dieser Technik kann man sich Formulare erstellen, die eine gewisse Basisfunktionalität haben. Diese können dann in den Anwendungen verwendet werden, ohne das man alles noch mal neu programmieren muß. Änderungen an den Basisformularen sind auch sofort in allen abgeleiteten Formularen (nach einem Recompile der Programme) verfügbar. Super !!! Genau das will ich haben. Aber: Wenn man nun eine Komponente auf das TForm1 legt, die in ComponentState kein csInheritable hat, dann kann ich das Formular nicht mehr vererben. Es gibt 3 Komponenten bei denen das der Fall ist.
Delphi-Quellcode:
unit VererbungIstDoof;
interface uses SysUtils, Classes; type TVererbungIstDoof = class(TComponent) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TVererbungIstDoof]); end; { TVererbungIstDoof } constructor TVererbungIstDoof.Create(AOwner: TComponent); begin inherited Create(AOwner); Exclude(FComponentStyle, csInheritable); end; end. Die Hilfe von Delphi 7 schreibt dazu csInheritable Abgeleitete Formulartypen können von der Komponente erben. Wenn bei einer der Komponenten eines Formulars das Flag csInheritable nicht gesetzt ist, kann das Formular nicht als Vorfahr für andere Formulare verwendet werden. Meine Frage ist nun: "Warum kann man das Vererben verhindern?" bzw. Warum ist das bei den 3 Komponenten der Fall. Sind die etwa nicht "vererbungssicher"? Weiß das jemand hier im Forum? Für eine Antwort wäre ich dankbar. ps: Auch für Vorschläge, wie man trotzdem Formulare mit einem TActionManager vererben kann. ;-) |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Den Rest muss ich mir mal durch den Kopf gehen lassen. ...:cat:... |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Ich dreh mich schon so lange im Kreis, das es mir langsam schwindlig wird :spin2: DatenModul bringt mir in dem Fall nicht viel. Wäre aber OT das genau zu erklären. |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Nur als Hinweis: es gibt dazu schon eine Anfrage im QC (
![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Das es von TCustomActionManager explizit entfernt wird wusste ich ja schon. Aber beruigend zu wissen, dass ich nicht der Einzige bin, der solche Probleme hat. |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
ist eigentlich eine wirklich interessante Frage. Hab noch gar nicht drüber nachgedacht, dass Delphi ja auch diese Funktionalität bietet. An sich gibt es ja auch in anderen Sprachen die Möglichkeit eine Klasse nicht erweiterbar zu deklarieren. In Java wäre eine solche Klasse dann mit dem Schlüsselwort final versehen. Ich weiß nicht warum Delphi in diesen 3 von dir genannten Fällen keine Vererbung zulässt, aber die sehr generelle Motivation sollte hier eigentlich weniger gegeben sein. So weit ich weiß ist die Motivation eigentlich, dass man Methoden statisch bindet, wenn es keine weiteren Ableitungen gibt. Dies ist in Delphi automatisch bei jeder Methode der Fall, die nicht mit virtual oder dynamic versehen wird. Sollten jetzt also Methoden "mitgeschleppt" werden, die an dieser Stelle noch nicht statisch sind, würde dies so geändert werden. Es entfällt ein Overhead (der zu vernachlässigen sein sollte). Es ist (imo) häufig mal ärgerlich, wenn man eine Klasse findet und die nicht weiter abgeleitet werden kann. Wie gesagt, ist ein wenig perfomanter (vielleicht stammt es auch aus einer Zeit als es mit der Perfomance noch nicht so weit her war). Heute wird es hauptsächlich für z.B. private Klassen eingesetzt. Hier kann der Kompiler ein wenig mehr optimieren. An sonnsten ist es vielleicht noch ein gutes Mittel um zu verhindern, dass jmd. ein Komponente die man verkauft einfach ableitet und nach eigenen Bedürfnissen anpasst. Hat jmd. die dcu stünde es ihm sonst (virtuelle Mehtoden vorrausgesetzt) frei dies zu tun, was man natürlich wieder als Leistung verkaufen könnte... Bin mir allerdings null sicher, ob eine dieser Motivationen auch bei Delphi hinter der Möglichkeit steckt (denke fast eher nicht!). Gruß Der Unwissende |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Also ich vermute, dass es verschiedene Komponenten gibt, die nur einmal pro Anwendung erlaubt sind, oder genutzt werden sollen (XPManifest, TDatabase usw.).
Grad bei TDatabase darf pro Anwendung nur eine TDatabase pro Datenbank definiert sein. Wenn Du jetzt aber von einer Form erbst, die eine TDatabase implementiert, so hast du zwangsläufig 2 identische Verbindungen. ![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
...:cat:... |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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 by Thomas Breitkreuz