2017-10-10 6 views
2

this questionの回答に基づいて、宣言でフィールドを初期化したクラスがある場合、そのクラスを拡張してサブクラスのデフォルト値を変更する必要がありますか?サブクラスがコンストラクタで初期化されるときに、スーパークラスの宣言にフィールドの初期化を保持する必要がありますか?

私は、サブクラスのコンストラクタで新しいデフォルト値を割り当て、スーパークラスの宣言で割り当てを維持する必要があります?:

public class Bird { 
    private boolean flight = true; 
} 

public class Penguin extends Bird { 
    public Penguin() { 
     flight = false; 
    } 
} 

または両方のクラスは、コンストラクタ内のフィールドを初期化するように、私はリファクタリングする必要がありますか?

this questionの回答からは、技術的に大きな違いはないように見えます。したがって、これは意味に関する質問です。

+2

現在、 'Penguin'は' Bird'にアクセスできないので、コードはコンパイルされません。個人的には、 'Bird'に保護されたコンストラクタを提供して、サブクラスが' flight'の値を提供できるようにします。そうすれば、フィールドを非公開にして最終的にすることができます。 –

+0

フライトは子クラスでプライベートです。 – Optional

+1

可視性の問題にもかかわらず、これは意見に基づいています。個人的には、私は親の 'Bird'で一般的な/デフォルトの値を定義することを好みます。しかし、すべての子クラスはそれらを必要な値で上書きします。したがって、親の値は、私または他の誰かが子供の値を設定することを忘れた場合、デフォルトまたはフォールバックとして存在するだけです。 – Korashen

答えて

2

第2例との違い。より自由な、ダイナミックな使用方法については

public class Bird { 
    public final boolean flight; 

    public Bird() { 
     this(true); 
    } 

    protected Bird(boolean flight) { 
     this.flight = flight(); 
    } 
} 

public class Penguin extends Bird { 
    public Penguin() { 
     super(false); 
    } 
} 

public class Bird { 
    protected boolean flight = true; 
    public boolean hasFligth() { 
     return flight; 
    } 
} 

public class Penguin extends Bird { 
    public Penguin() { 
     flight = false; 
    } 
} 

flightはない財産とみなされるかもしれないが(ケース - - 素敵な最も制限)不変プロパティについては

個々のBird/Penguinオブジェクトには、クラスのプロパティです(Penguin、Ostrich、...)。戦略パターンの一種、または:

Map<Class<Bird>, Boolean> 
Set<Class<Bird>> // better 

クラスフライトでは反対側に位置します。

1

あなたが拡張のためにあなたのスーパークラスを設計し、特定のフィールドが別の値に初期化可能であることを許可したい場合、あなたはおそらく、コンストラクタパラメータを経由して、これを公開する必要がありますが:

public class Bird { 
    private final boolean flight = true; 
    public Bird() { 
     this(true); 
    } 
    public Bird(boolean flight) { 
     this.fligjt = flight; 
    } 
    public boolean isFlight() { 
     return this.flight; 
    } 
} 

public class Penguin extends Bird { 
    public Penguin() { 
     super(false); 
    } 
} 
関連する問題