2016-03-29 5 views
0

Ich habe einige Probleme mit der Vererbung (Student hier). Ich muss in der Lage sein, 1 geerbtes privates Feld für jede Unterklasse zu verwenden, die ich mache. Offensichtlich haben Unterklassen keinen Zugriff auf vererbte Felder. Wenn jedoch ein neues Objekt erstellt wird, ist das geerbte private Feld ein Teil dieses Objekts. Für meine Zwecke muss jede Unterklasse jedoch einen eigenen spezifischen Wert für dieses geerbte Feld haben. Mein erster Versuch sieht ungefähr so ​​aus:Hinzufügen bestimmter Werte für geerbte Felder

Public class A { 

    private int x = 0; 

    public A(int n) { 

     x = n; 
    } 

    public int useX() { 

     return x; 
    } 
} 

Public class B Extends A { 
    int n = 1; 

    public B() { 
     super(n); 
    } 

    useX(); // Return 1? 
} 

Public class C Extends A { 
    int n = 2; 

    public B() { 
     super(n); 
    } 

    useX(); // Return 2? 
} 

jedoch meine Professoren sagen mir, dass ich auch innerhalb meiner Super-Klasse mit einem Setter-Methode werden könnte, das neue Feld zu schaffen, und von dort bin ich verwirrt. Kann mir jemand helfen, mich in die richtige Richtung zu lenken?

+1

Der Code, den Sie gepostet haben, kompiliert nicht (es gibt kein 'n' in' B' und 'C', und Sie können vor' super' nichts machen). Wenn Sie das jedoch beheben, denke ich, dass Ihre Herangehensweise die richtige ist. Das Verwenden eines Konstruktors ist eine gute Möglichkeit, den Wert zu initialisieren, ohne unnötigen uneingeschränkten Zugriff auf den Wert zu geben. – resueman

+0

Ich habe gerade int in den Deklarationen aufgehört. Ich habe es behoben –

Antwort

3

Ein gewöhnlicher Java Bean bietet publicAccessoren und Mutatoren (aka Getter und Setter) dafür Felder ist. Sie können jedoch einen protected Setter bereitstellen. So etwas wie,

public class A { 
    private int x = 0; 

    public int getX() { // <-- the usual name. 
     return x; 
    } 

    protected void setX(int x) { 
     this.x = x; 
    } 
} 

Dann können Sie Ihre Unterklassen

public class B extends A { 
    public B() { 
     super(); 
     setX(1); 
    } 
} 

diesen Setter aufrufen und dann B.getX() (oder B.useX() wenn Sie wirklich bevorzugen) wird 1 zurück.

+1

'A' hat keinen Konstruktor ohne Argumente, also' super() 'wird nicht ohne Parameter funktionieren. – resueman

+1

@resueman Guter Punkt. Der explizite Konstruktor wurde entfernt. sicherlich nicht nötig für mein Beispiel. –

+0

Also eine Frage, die ich jetzt habe, ist, wenn ich SetX (x) in der Klasse B und SetX (y) in der Klasse C, würde sie den Wert für die Klasse A oder für ihre jeweiligen Klassen ändern? –