multiple - java super() constructor




Standardkonstruktoren in Java (4)

Also alles schön und gut, aber wie bekomme ich das jetzt zum Laufen, ohne diesen Konstruktor in jeder abgeleiteten Klasse zu duplizieren?

Sie müssen die Konstruktorsignaturen duplizieren, wenn die Unterklasse Konstruktoren mit denselben Signaturen haben soll. Aber Sie müssen den Code nicht duplizieren - Sie ketten nur zum Superklassenkonstruktor:

public Bar(int x, int y) {
    super(x, y);
    // Any subclass-specific code
}

Natürlich, wenn Sie die Superklassenparameter aus einem anderen Parametersatz herausrechnen können, ist das in Ordnung. Beispielsweise:

public Bar(int x) {
    super(x, x * 2);
    // Any subclass-specific code
}

Sie müssen wirklich herausfinden, welche Informationen benötigt werden, um einen Bar zu konstruieren - das sollte Ihre Konstruktoren diktieren.

Wenn dies ein Problem ist, ist es möglich, dass Sie die Vererbung überstrapazieren. Es ist schwer zu sagen, ohne eine Vorstellung davon, was Ihre tatsächlichen Klassen sind, aber Sie sollten sich mit der Verwendung von Komposition statt Vererbung befassen. Es ist kein Allheilmittel, aber es kann solche Dinge vermeiden.

Ich weiß, dass ich hier eine ernsthafte Frage stelle ...

Ich habe eine Klasse Foo und eine Klasse Bar , die Foo . In Foo ich einen Konstruktor, der eine Reihe von Parametern annimmt, die er auf seine Felder setzt. Das Ableiten von Klassen wie Bar muss dies normalerweise nicht ändern. Jetzt gibt mir meine IDE "Es gibt keinen Standardkonstruktor in Foo verfügbar" . Von etwas Googeln scheint dies zu sein, weil "Konstruktoren nicht vererbt werden". Also alles schön und gut, aber wie bekomme ich das jetzt zum Laufen, ohne diesen Konstruktor in jeder abgeleiteten Klasse zu duplizieren? Ich gehe davon aus, dass es einen vernünftigeren Ansatz gibt?


Das Problem ist damit gelöst:

class Foo{
       Foo(int a, int b){}
}

class Bar extends Foo{
         //Here must be a constructor OR declare a constructor in Foo without parameters
         Bar(){super(1,1)} //this is an example

}

Andere Lösung ist:

class Foo{
   Foo(int a, int b){}
   Foo(){}
}

class Bar extends Foo{
}

Denken Sie daran, dass, wenn ein Konstruktor mit Parametern in der SuperClass (in diesem Fall Foo), der implizite Konstruktor auf der Kindklasse (in diesem Fall Bar) immer einen impliziten Aufruf von " Super () " hat (immer eins sein muss) wenn nicht explizit).


Nein, es gibt keinen "vernünftigen" Ansatz mehr. Wenn Ihre Basisklasse keinen Standardkonstruktor hat, müssen Sie explizit den korrekten Konstruktor aus allen untergeordneten Klassen aufrufen.

Beachten Sie, dies bedeutet nicht, dass untergeordnete Klassen denselben Konstruktor haben müssen wie die Basisklasse. Zum Beispiel ist dies vollkommen gültig:

class Foo {

    protected int a;
    protected int b;

    protected Foo(final int a, final int b) {
        this.a = a;
        this.b = b;
    }
}

class Bar extends Foo {

    protected Bar() {
        super(0,0);
    }
}

Verwenden Sie den super :

public Bar(int a, double b, ...) {
    super(a, b, ...);
}






constructor