# In abstrakter Klasse Konstruktor von Instanz implementieren



## DStrohma (6. Aug 2012)

Hallo,

ich würde gerne in einer abstrakten Klasse den Konstruktor der Instanz die diese abstrakte Klasse erweitert bereits ausimplementieren.
Da mir aber in der abstrakten Klasse natürlich noch nicht der Name der Klasse bekannt ist die die abstrakte Klasse implementiert, weis ich nicht wie ich das machen soll...

Geht das überhaupt?

Vielen Dank im Voraus!


----------



## Gast2 (6. Aug 2012)

Sobald du einen Parameter übergeben willst brauchst du explizite Konstruktoren in der abstrakten Klasse und dessen implementierungen.


----------



## Mujahiddin (6. Aug 2012)

Wenn du eine abstrakte Klasse hast und mehrere Unterklassen, dann wäre es besser, einen Standardkonstruktor, der für alle Unterklassen gleich ist, in die Oberklasse einzubauen.
Aber um das zu tun, wie du es beschrieben hast, kannst du einfach eine Abfrage einbauen. 
	
	
	
	





```
if(getClass() == Unterklasse.class)
```
Ist aber ziemlich schlechter Stil, sollte man sich nicht Angewöhnen.


----------



## FArt (6. Aug 2012)

Mujahiddin hat gesagt.:


> Wenn du eine abstrakte Klasse hast und mehrere Unterklassen, dann wäre es besser, einen Standardkonstruktor, der für alle Unterklassen gleich ist, in die Oberklasse einzubauen.
> Aber um das zu tun, wie du es beschrieben hast, kannst du einfach eine Abfrage einbauen.
> 
> 
> ...



Der == Vergleich wird nicht sinnvoll funktionieren, stattdessen sollte man equals, oder bessern noch, instanceof verwenden.

Allgemein für den TS: schilder doch mal was du eigentlich erreichen möchtest. Evtl. ist da ein Pattern besser geeignet als eine Ableitung mit abstrakter Klasse.


----------



## tfa (6. Aug 2012)

Jede Klasse hat mindestens einen Konstruktor. Was nötig für die Initialisierung der abstrakten Klasse, kommt eben in den Konstruktor dieser Klasse. Alles andere in die Konstruktoren der implementierenden Subklassen. Wenn man komplexere Sachen machen möchte, könnte man eine Factory o.ä. benutzen.


----------



## Lit-Web (6. Aug 2012)

tfa hat gesagt.:


> Jede Klasse hat mindestens einen Konstruktor. Was nötig für die Initialisierung der abstrakten Klasse, kommt eben in den Konstruktor dieser Klasse. Alles andere in die Konstruktoren der implementierenden Subklassen. Wenn man komplexere Sachen machen möchte, könnte man eine Factory o.ä. benutzen.



Das ist so nicht ganz richtig, denke ich. Wenn von einer Klasse eine Instanz gebildet wird, sprich ein Objekt instanziert wird, dann wird automatisch immer der Standartkonstruktor aufgerufen, es sei denn der Konstruktor wird überladen, sprich man hat mehrere Konstruktoren. Bei einer Klasse die z.B. nur statische Methoden und Properties bietet bzw. beinhaltet wird nie ein Konstruktor aufgerufen, spricht nicht die Klasse hat einen Konstruktor sondern das Objekt was von einer Klasse instanziert wird.

Ich würde, wenn ich mit Vererbung arbeiten würde den Standartkonstruktor in die abstrakte Klasse packen, also so wie er mindestens in jeder erbenden Kindklasse aufgerufen werden muss.
Du hast dann eben in jeder Kindklasse die Möglichkeit den Konstruktor zu überladen, sprich mit mehr Parametern oder mit Paramtern unterschiedlicher Datentypen.

Aber wie schon mal beschrieben, solltest du deine Problem / Aufgabenstellung mal näher beschreiben, oft lässt sich ein Problem besser als mit Vererbung lösen.

Gruß Lit-Web


----------



## Marcinek (6. Aug 2012)

Lit-Web hat gesagt.:


> Das ist so nicht ganz richtig, denke ich. Wenn von einer Klasse eine Instanz gebildet wird, sprich ein Objekt instanziert wird, dann wird automatisch immer der Standartkonstruktor aufgerufen, es sei denn der Konstruktor wird überladen, sprich man hat mehrere Konstruktoren. Bei einer Klasse die z.B. nur statische Methoden und Properties bietet bzw. beinhaltet wird nie ein Konstruktor aufgerufen, spricht nicht die Klasse hat einen Konstruktor sondern das Objekt was von einer Klasse instanziert wird.
> [...]
> Gruß Lit-Web



Nein das ist nicht korrekt. Implizit hat jede Klasse einen Konstuktor. Egal, was da für Methoden drin sind. Wenn gar keiner Angegeben ist (im Code), dann macht der Compiler diesen eben da rein. 

Wenn ich Konstruktoren implementiere, dann gelten diese und keine impliziten.

----

Mich erinnert diese Frage an eien typische DennisXX, Kossy Frage. Wieso soll eine abstrakte Klasse dinge einer von ihr unbekannten abgeleiteten Klasse machen???

Häufig liegt hier nur ein designfehler vor, bei dem die abstrakte Klasse über ihre Kompenez hinaus belastet wird.


----------



## Mujahiddin (6. Aug 2012)

FArt hat gesagt.:


> Der == Vergleich wird nicht sinnvoll funktionieren, stattdessen sollte man equals, oder bessern noch, instanceof verwenden.
> 
> Allgemein für den TS: schilder doch mal was du eigentlich erreichen möchtest. Evtl. ist da ein Pattern besser geeignet als eine Ableitung mit abstrakter Klasse.



Ich widerspreche dir ungerne, aber er funktioniert in der Tat.
Natürlich nur, wenn diese "Unterklasse" auch wirklich die letzte Instanz ist. Wenn es noch eine Unterunterklasse gibt, funktioniert es nicht mehr, da sollte man lieber auf instanceof zurückgreifen.


----------



## FArt (6. Aug 2012)

Mujahiddin hat gesagt.:


> Ich widerspreche dir ungerne, aber er funktioniert in der Tat.


Ja, das stimmt, weil die VM dafür sorgt, dass Klassen pro Classloader Singletons sind...


----------



## DStrohma (7. Aug 2012)

Ich habe eine Vorlage (eben die abstrakte Klasse) für mehrere Pannel die als Kategorien in einem "Einstellungen" Fenster dienen. Diese Pannels sollen immer im Konstruktor einen Controller (Controller vom MVC Pattern) besitzen und dann speichern.
Das wollte ich eben alles schon in der abstrakten Klasse machen um es nicht jedesmal wieder in der Kategorie (dem Pannel) selbst machen zu müssen.


----------



## tfa (7. Aug 2012)

```
public abstract class AbstractPanel {
    
    public AbstractPanel(Controller ctrl) {
        this.controller=ctrl;
    }
}


public class MyPanel extends AbstractPanel {
    
    public MyPanel(Controller crtl) {
        super(crtl);
    }
}
```


----------



## DStrohma (7. Aug 2012)

Uhhh... das ist genau was ich gebraucht habe  Super, danke!


----------

