Re: Klasse überladen



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.
.



Relevant Pages

  • Re: =?ISO-8859-15?Q?Anf=E4nger=3A?= Dialog aus ui-Datei ableiten
    ... > du hast eine Klasse A, dann kannst du eine Klasse B schreiben, die ... Ich habe eine MyDialog die sich von MyDialog_base ableitet. ... was in der MyDialog_base drinsteht in den Konstruktor von MyDialog ... Next by Date: ...
    (de.comp.os.unix.programming)
  • Re: Sind Klassen in der Form das richtige?
    ... >Beim Konstruktor - oder verstehe ich die Frage falsch? ... >> Ein Public Class LogEntry geht ja wohl nicht. ... >> Gibt es eine Prozedur o.ä. innerhalb der Klasse, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Globale Klasse und Konstruktor
    ... > Innerhalb dieser Funktionen/Methoden habe ich ein paar TRACE Makros ... wann die Klasse instanziiert und wann ... Mit was arbeitet dein TRACE-Makro? ... Konstruktor deiner globalen Klasse vor einem eventuellen Konstruktor, ...
    (microsoft.public.de.vc)
  • Laufzeitfehler OutOfRangeException
    ... "private ArrayList alObjects;" ... Im Konstruktur dieser Klasse steht zum Instanzieren dieser Liste nun ... das Programm und der Konstruktor der Klasse wird aufgerufen, ... Witz ist, kommentiere ich meine Liste aus, so wird genau dieser Fehler bei ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)
  • Re: Checked cloning in Java 1.5
    ... Paul Ebermann schrieb ... Es kann zur Laufzeit nur festgestellt werden, ... Eine Konstruktor ist eine Methode, ... Objekt der der aktuellen Klasse zurückzugeben ...
    (de.comp.lang.java)