0

サブクラスにすべて継承する必要がある親クラスに多数のフィールドがある場合、サブクラスをスーパークラスにネストするか、フィールドをプライベートではなく保護するか、または保護されたアクセサーを使用する方がよいでしょうか? それとも他の代替案ですか?

4

5 に答える 5

3

最も簡単な解決策は、スーパークラス フィールドまたはインスタンス変数を保護することですが、それらを非公開にすると、カプセル化の原則に準拠しているため、概念的にはるかに優れた getter および setter を介していつでもアクセスできます。

于 2013-04-09T07:48:30.147 に答える
1

サブクラスからアクセスできるようにする場合は、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 つの例は、他のクラスが親クラスと同じクラスにあるため機能します。

グリッドに従ってください、それだけです。

于 2013-04-09T07:57:59.247 に答える
1

保護されたアクセサーを使用するのが最善の方法であり、より一般的なアプローチだと思います。

于 2013-04-09T07:48:45.933 に答える
1

保護されたフィールドまたは保護されたアクセサー メソッドを公開することが理にかなっている場合があります。したがって、すべては親クラスの設計と、子クラスで親クラスをどのように利用するかによって異なります。

ただし、確かなことは、「サブクラスをスーパークラスにネストしたほうがよいか」ということです。<-これが正しい選択であることはめったにありません。

于 2013-04-09T08:11:34.590 に答える
1

最も簡単な解決策は、フィールドを保護することです。そうしないとやむを得ない理由がない限り、そのままにしてください。

于 2013-04-09T07:46:45.097 に答える