In abstrakter Klasse Konstruktor von Instanz implementieren

DStrohma

Bekanntes Mitglied
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!
 
Sobald du einen Parameter übergeben willst brauchst du explizite Konstruktoren in der abstrakten Klasse und dessen implementierungen.
 
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.
Code:
if(getClass() == Unterklasse.class)
Ist aber ziemlich schlechter Stil, sollte man sich nicht Angewöhnen.
 
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.
Code:
if(getClass() == Unterklasse.class)
Ist aber ziemlich schlechter Stil, sollte man sich nicht Angewöhnen.

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.
 
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.
 
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
 
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.
 
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.
 
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.
 
Java:
public abstract class AbstractPanel {
    
    public AbstractPanel(Controller ctrl) {
        this.controller=ctrl;
    }
}


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

Neue Themen


Zurück
Oben