Re: Klasse überladen
- From: Heiko Nocon <Heiko.Nocon@xxxxxxx>
- Date: Thu, 21 Aug 2008 20:30:09 +0200
Heiko wrote:
Unschön finde ich es nun, im Hauptformular DecendA und DecendB zu
deklarieren. Ich hätte gern eine Art überladene Klasse.
Das jibbet nich.
Leider gebietet die Logik, daß ein Konstruktor wissen muß, die Instanz
welcher Klasse er da genau erzeugen soll. Dazu gibt es nur eine eine
einzige Möglichkeit: Man muß den Konstruktor der richtigen Klasse
aufrufen.
Ein Konstruktor der von dir gewünschten Art ist also nicht möglich. Was
allerdings möglich ist, ist eine sog. "Factory-Klasse", die Instanzen
verschiedener Klassen erzeugen kann, die von einer gemeinsamen
Basisklasse abstammen. Die Factoryklasse kann natürlich auch mit der
Basisklasse der ganzen Sache identisch sein.
Dazu muß allerdings dann auch die Factory-Klasse alle Erben der
Basisklasse kennen, von denen sie Instanzen erzeugen können soll. Genau
genommen wird das Problem der "Bekanntheit" also nur woanders hin
verlagert.
Auch die Factory-Klasse muß die Erben-Klassen unterscheiden können,
damit man ihr sagen kann, was genau sie da erzeugen soll. Man ersetzt
also eigentlich den zur Compilezeit bekannten Zeiger auf die Klasse
(mitgeteilt durch den Klassenbezeichner) nur durch ein entsprechendes
Laufzeitkonstrukt.
Das übliche und sinnvolle Verfahren dafür ist, daß die Erben zusammen
einen "Namensraum" bilden, in dem jede der Klassen einen eindeutigen
Namen haben muß. In deinem Beispiel umfaßt der Namensraum genau 256
verschiedene "Namen", entsprechend den verschiedenen Werten, die ein
Byte so annehmen kann. Man kann aber auch wirklich Namen verwenden. Die
Erben von TComponent z.B. tuen das. Da findest du auch all den Scheiß,
den ich oben erklärt habe und noch einige Spielereien mehr. Ähnliche
Konzepte findest du auch bei Microsofts COM und natürlich bei vielen
anderen OOP-Frameworks.
Wie auch immer, irgendwer muß sich um die Verwaltung des Namensraumes
kümmern, die Registrierungen der Erbenklassen entgegennehmen und bei
Bedarf Instanzen der gewünschten Klasse erzeugen.
Genau das machen Factory-Klassen. Damit sie das können, gibt es in
ObjectPascal das Deklarationskonstrukt der Klassenreferenzen. "class
of".
--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gefängnis nicht unter 5 Jahren bestraft.
.
- Follow-Ups:
- Re: Klasse überladen
- From: Heiko
- Re: Klasse überladen
- Prev by Date: Re: kleinbuchstaben
- Next by Date: Re: Klasse überladen
- Previous by thread: Re: Klasse überladen
- Next by thread: Re: Klasse überladen
- Index(es):
Relevant Pages
|