2016-03-29 12 views
0

継承に関するいくつかの問題があります(ここの学生)。私は1つの継承されたプライベートフィールドを私が作る各サブクラスに利用できるようにする必要があります。明らかにサブクラスは継承されたフィールドにアクセスすることはできませんが、継承されたプライベートフィールドがそのオブジェクトの一部である新しいオブジェクトが作成されたときには、私の目的のために、各サブクラスはその継承されたフィールドのための独自の特定の値を持つ必要があります。私の教授は、私はまた、その新しいフィールドを作成するために、私のスーパークラスの内部のsetterメソッドを使用してすることができ、そこから私は混乱していていることを教えしかし継承されたフィールドに特定の値を追加する

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? 
} 

:私の最初の試みは、次のようになります。誰かが正しい方向に私を向けるのを助けることができますか?

+1

投稿したコードはコンパイルされません( 'B'と' C'には 'n'がなく、' super'の前には何もできません)。あなたがそれを修正しても、私はあなたのアプローチが正しいと思います。コンストラクタを使用すると、値に無制限に無制限にアクセスすることなく、値を初期化することができます。 – resueman

+0

私は宣言でintを中止しました。私はそれを修正しました –

答えて

3

通常のJava Beanが、それがフィールドだためpublicアクセサミューテータ(別名ゲッターセッター)を提供します。しかし、あなたはprotectedセッターを提供することができます。何かのように、

public class A { 
    private int x = 0; 

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

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

次に、あなたのサブクラスがそのセッターを呼び出すことができます

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

そしてB.getX()(またはB.useX()もしあなたが本当に好む)が1を返します。

+1

'A'は引数なしのコンストラクタを持っていないので、' super() 'はパラメータなしでは動作しません。 – resueman

+1

@resueman良い点。明示的なコンストラクタを削除しました。私の例ではそれが必要ではありませんでした。 –

+0

私が今質問しているのは、BクラスにsetX(x)を、CクラスにsetX(y)を設定すると、Aクラスまたはそれぞれのクラスの値を変更するのでしょうか? –

関連する問題