2016-07-07 1 views
4

Also lassen Sie uns sagen, dass ich Klasse A, die wie folgt definiert ist:Wie werden Standardwerte in einer Vererbungskette behandelt, ohne doppelten Code zu schreiben?

public class A{ 
    private int x; 

    public A(){ 
     this(13); 
    } 
    public A(int x){ 
     this.x = x; 
    } 
} 

Und ich habe dann eine Klasse B, die y implementieren muss, so wie folgt aus:

public class B extends A{ 
    private int y; 

    public B(){ 

    } 
    public B(int x){ 
     this(x, 0); 
    } 
    public B(int x, int y){ 
     super(x); 
     this.y = y; 
    } 
} 

Meine Frage ist, : Was mache ich in public B()? Benenne ich super(), so dass A den Standardwert/tut was auch immer und dann eine andere this.y = y in diesem Konstruktor, oder rufe ich this(13)?

Beide Ansätze scheinen einige schlechte Praktiken zu erfordern. Man hat mich this.y = y an zwei Stellen schreiben. Der andere erfordert, dass ich die Standardwerte wiederhole und bei jeder Änderung eines Standardwertes geändert werden muss.

+0

Sie müssen nichts tun. 'B()' ruft implizit 'super()' auf, also wird 'A()' aufgerufen. –

+0

Aber wenn ich nichts tue, muss ich immer noch einen Standardwert für y angeben, was das Problem ist. Am Ende muss ich das nochmal machen, wenn ich es unten schon gemacht habe. – WinterDev

+0

Oh, richtig. Es tut uns leid. Habe nicht bemerkt, dass du 'y' zugewiesen hast. Sie müssen also nur "y" in "B()" zuweisen. –

Antwort

0

Wenn in der ersten Zeile des Konstruktors kein Konstruktor aufgerufen wird, wird der Standardkonstruktor der geerbten Klasse aufgerufen. Wenn es keinen Standardkonstruktor gibt, müssen Sie definieren, welcher Superkonstruktor in der ersten Zeile Ihres Konstruktors verwendet werden soll.

public class A{ 

    public A(){ 

    } 

    public A(String text){ 

    } 

} 

public class B extends A{ 

    public B(){ 
     //having nothing is same as super(); 
     //here you can also call the other constructor 
     //super(""); is allowed 
    } 

    public B(String text){ 
     //having nothing is same as super(); 
     //but if you add a super(text) then you set this instance to super(text); instead 
    } 

} 

public class C{ 

    public C(String text){ 

    } 

} 

public class D extends C{ 

    public D(){ 
     super();// this is incorrect and will not compile 
    } 

    public D(String text){ 
     super(text);//this is fine 
    } 

} 

Hoffe das half.

1

Wenn die Felder nicht endgültig sind, können Sie die Standardwerte angeben, an denen Sie sie deklarieren. So würde der Code wie aussehen:

class A{ 
    private int x = 13; 
    public A(){ 
    //use default value for x 
    } 
    public A(int x){ 
    this.x = x; 
    } 
} 

class B extends A { 
    private int y = 0; 
    public B(){ 
    //use default value for x and y 
    } 
    public B(int x){ 
    super(x); 
    //use default value for y 
    } 
    public B(int x, int y){ 
    super(x); 
    this.y = y; 
    } 
} 
+0

Wie ich in einem Kommentar sagte, war mein Fall eine extrem vereinfachte Version eines anderen Satzes von Eltern/Kind-Klassen, in denen es außerhalb des Konstruktors nicht sinnvoll war, es außerhalb des eigentlichen Konstruktors zu implementieren. Ich denke, ich hätte in meiner Post präziser sein sollen. Außerdem ist es ein Hausaufgabenproblem, daher kann ich den Inhalt der Elternklasse sowieso nicht bearbeiten. – WinterDev

+0

@WinterDev dann würde ich für 'super() gehen; this.y = y; 'um zu vermeiden, den Standardwert von x in B zu duplizieren. – assylias

Verwandte Themen