サブクラスにすべて継承する必要がある親クラスに多数のフィールドがある場合、サブクラスをスーパークラスにネストするか、フィールドをプライベートではなく保護するか、または保護されたアクセサーを使用する方がよいでしょうか? それとも他の代替案ですか?
5 に答える
最も簡単な解決策は、スーパークラス フィールドまたはインスタンス変数を保護することですが、それらを非公開にすると、カプセル化の原則に準拠しているため、概念的にはるかに優れた getter および setter を介していつでもアクセスできます。
サブクラスからアクセスできるようにする場合は、public と protected の 2 つのオプションしかありません。Protected はおそらくあなたが望むものです。extends
次の表は、Java で継承用のキーワードを使用する場合に適用されます。
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
サブクラスをスーパークラスにネストすると、プライベートも使用できます。これは、内部クラスが親クラスの一部であるため、プライベート メソッドにもアクセスできるためです。
public class Parent {
private int x = 5;
//Not really a subclass
private class NestedClass {
public NestedClass() {
int hax = new Parent().x; // Works!
}
}
//More of a nestedclass than a subclass.
private class SubClass extends Parent {
public SubClass() {
int stillHax = new Parent().x;
}
}
}
extends
またはキーワードを使用するまで継承を使用しないためimplements
、サブクラスで親クラスを (別のファイルで) 拡張し、変数に保護 (またはパブリック) レベルのアクセスを許可する必要があります。同じパッケージまたは同じクラスにあることは、グリッド内で優先されることに注意してください。上記の 2 つの例は、他のクラスが親クラスと同じクラスにあるため機能します。
グリッドに従ってください、それだけです。
保護されたアクセサーを使用するのが最善の方法であり、より一般的なアプローチだと思います。
保護されたフィールドまたは保護されたアクセサー メソッドを公開することが理にかなっている場合があります。したがって、すべては親クラスの設計と、子クラスで親クラスをどのように利用するかによって異なります。
ただし、確かなことは、「サブクラスをスーパークラスにネストしたほうがよいか」ということです。<-これが正しい選択であることはめったにありません。
最も簡単な解決策は、フィールドを保護することです。そうしないとやむを得ない理由がない限り、そのままにしてください。