this questionの回答に基づいて、宣言でフィールドを初期化したクラスがある場合、そのクラスを拡張してサブクラスのデフォルト値を変更する必要がありますか?サブクラスがコンストラクタで初期化されるときに、スーパークラスの宣言にフィールドの初期化を保持する必要がありますか?
私は、サブクラスのコンストラクタで新しいデフォルト値を割り当て、スーパークラスの宣言で割り当てを維持する必要があります?:
public class Bird {
private boolean flight = true;
}
public class Penguin extends Bird {
public Penguin() {
flight = false;
}
}
または両方のクラスは、コンストラクタ内のフィールドを初期化するように、私はリファクタリングする必要がありますか?
this questionの回答からは、技術的に大きな違いはないように見えます。したがって、これは意味に関する質問です。
現在、 'Penguin'は' Bird'にアクセスできないので、コードはコンパイルされません。個人的には、 'Bird'に保護されたコンストラクタを提供して、サブクラスが' flight'の値を提供できるようにします。そうすれば、フィールドを非公開にして最終的にすることができます。 –
フライトは子クラスでプライベートです。 – Optional
可視性の問題にもかかわらず、これは意見に基づいています。個人的には、私は親の 'Bird'で一般的な/デフォルトの値を定義することを好みます。しかし、すべての子クラスはそれらを必要な値で上書きします。したがって、親の値は、私または他の誰かが子供の値を設定することを忘れた場合、デフォルトまたはフォールバックとして存在するだけです。 – Korashen