# Klasse A aus Klasse B instanzieren



## js-mueller (14. März 2006)

Hi,

es geht um folgendes, und zwar habe ich einmal Klasse A und einmal Klasse B.
Die Klasse B ist von der Klasse A abgeleitet.

Frage 1: Kann Klasse B einen privaten Konstrucktor haben wenn Klasse A einen offenen hat?

Frage 2: Wenn ja, kann ich Klasse B mit Klasse A instanzieren. Es geht darum das Klasse A eine getInstance methode bereithalten soll, in welcher Werte für Klasse B vorgegeben werden.

Ich hoffe ihr versteht was ich meine und könnt mir helfen

edit: Ich seh grad im Topic stehts falsch, kann den leider nicht ändern, Klasse B soll mit methode aus A instanziert werden.


----------



## -ben- (14. März 2006)

Hi!

1. Ja. Konstruktoren werden nicht vererbt! Andersrum gienge es allerdins nicht, da implizit der Konstruktor von super aufgerufen wird - nur wenn dieser private ist, wirds schwierig  

2. Wie denn, wenn du den Konstruktor von B private machen willst? Aber sonst wäre dies natürlich möglich

Gruss
ben


----------



## js-mueller (14. März 2006)

Naja ich hab mir vieleicht gedacht das man den Konstucktor der Klasse A benutzen könnte um Klasse B zu initialisieren.
Es ist halt so das es eine Instanz der Klasse A gibt und eine Klasse B erstellt werden muss, die Klasse B kann aber nur mit werten aus der Klasse A existieren, deswegen wollt ich das üben diesen weg machen, vieleicht gibts ja auch ne alternative.


----------



## takidoso (17. März 2006)

huch, das klingt ja aufregend kompliziert.
Wenn ich Dich richtig verstehe möchtest Du Objekte einer Klasse über eine factory ins Leben rufen. Das ist ja auch ganz in Ordung aber warum Soll eine Abgeleitete Klasse von Ihrer Elternklasse instanziiert werden und dann noch mit einem Konstuktor der nicht öffentlich ist. Deine Motivation sheint demnach zu sein dass Objekte der abgeleiteten Klasse ausschließlich über Elternklasse instanziiert werden sollen. Also mit einem privaten Konstruktor geht das glaube ich nicht, wie schon der Vorredner bemerkte.

Ich selbst, wobei dies meine persönliche Meinung ist, finde es besser, Factories nicht in Ableitungsverwandschaft Ihrer Produkte (instanzierten Objekte) zu sehen, Da Du nähmlich dann auch ihre Kinder als Factories verwenden könntest, was ich privat gesehen für möglicherweise verwirrend finde, auch wenn es legal ist.

Besser finde ich den Ansatz eine klare Factory-Klasse zu haben, mit der ich über public Methoden (z.B. benannte als : *makeKlassenname* oder *createKlassenname*) meine gewünschen Objekte hole.
Wobei es dabei natürlich wieder verschiedene Spielarten gibt, wobei der Frage nachzugehen ist, ob die Objekte in dieser Factory-Klasse ebenfalls verwaltet werden sollen, sei es dass man sie über bspw. einer ID wiederfinden möchte, oder weil sie als Singleton-Objekte dienen sollen.
im letzteren Fall ist natürlich die Benahmung in *getKlassenname* verständlicher.

Dein Ansatz findet sich allerdings in den Java-Frameworks wieder, wobei dort soweit ich mich ad hoc erinnere immer public Konstructoren verwendet werden, wo dann meist als Kommentar darauf hingewiesen wird, dass man die getInstance einer anderen Klasse (häufig Elternklasse) verwendet werden soll (Beispiel DecimalFormat). Da ich annehme dass Du es aber lieber den Kosntruktor vor allgemeingebrauch verstecken willst, probiere es doch mal mit protected und tuh die Kindklasse in das selbe package wie die Elternkasse mit der instanziierenden Methode. Sollte eigetntlich gehen.

Takidoso


----------

