1

Java でのオブジェクト指向プログラミングを理解しようとしていますが、この問題があります。

たとえば、次のような親クラスがあるとします。

public class Shape {
    private int location;
    private Color color;
    // methods such as getLocation() and getColor()

    public Shape(int initialLocation, Color initialColor) {
        location = initialLocation;
        color = initialColor;
    }


}

メインメソッドで初期位置と初期色を持つ長方形を作成できるように、子クラスを作成するにはどうすればよいですか? Rectangle クラスでコンストラクターを作成しますか? 場所と色はプライベート フィールドであるため、できません。場所と色のアクセサ メソッドを作成し、インスタンス化後に場所と色を設定するだけですか? 私は推測しますが、アクセサーなしでこれを行う方法はありますか?

public class Rectangle extends Shape {
    public Rectangle(int initialLocation, Color initialColor) {
        super(initialLocation, initialColor);
    }

}

この基本的な概念に頭を悩ませることはできません。何か助けはありますか?

4

4 に答える 4

4

コンストラクターを再利用する

public class Shape {
    private int location;
    private Color color;

    public Shape(int location, Color color) {
        this.location = location;
        this.color = color;
    }
    // methods such as getLocation() and getColor()
}

public class Rectangle extends Shape {
    public Rectangle(int location, Color color /*, more */) { 
        super(location, color);
        // more
    }
}

この公式チュートリアルでは、その使用法について説明しています。

于 2013-09-28T20:50:24.873 に答える
1

インスタンス変数を として定義することはできますがprotected、これはオブジェクト指向のカプセル化の原則に反します。クラス Shape の各インスタンス変数にゲッターとセッターを使用します。また、Shape 内にコンストラクターを作成すると、Rectangle 内のスーパー コンストラクターを呼び出して、Rectangle 内の位置と色を設定できます。

public class Rectangle extends Shape {
    public Rectangle(int location, Color color) { 
        super(location, color);
    }
}

Shape に次のコンストラクタがある限り:

public class Shape {
    // location and color define.

    public Shape(int location, Color color) {
        this.location = location;
        this.color = color;
    }
    // getters and setters which are public for location and color
}
于 2013-09-28T20:50:43.537 に答える
1

変数を拡張したい場合は、修飾子をprotectedに変更して継承できるようにします。そうprivateしないと、子クラスに存在しなかったのと同じです。

于 2013-09-28T20:48:02.323 に答える
0

サブクラスによってのみアクセスされる基本クラスのプライベート メンバーは無意味です。それらを読みたい場合は、少なくとも public または protected getter が必要です。それらを書きたい場合は、少なくともパブリックまたは保護されたセッターおよび/またはそれらを初期化するコンストラクターが必要です。

于 2013-09-28T20:51:07.813 に答える