0

現時点で、私のアプリケーションには次のクラス階層があります。

  • 「クラスA」は親クラスです
  • 「クラス B」は「クラス A」の子クラスです。
  • 「クラス C」は「クラス A」の子クラスです。

現時点では、「クラス A」には「属性 D」と呼ばれる属性があり、これは「クラス B」では必須ですが、「クラス C」ではオプションです。

このデータ構造を表す最良の方法を教えてください。NULL かどうかを確認せずに ClassA.getAttributeD を参照させるのではなく、クラス B とクラス C を使用してフィールドを参照するように強制します。

4

3 に答える 3

2

でコンストラクターを追加Class BAttribute Dます。にはClass C、この属性のセッターがあります。

abstract class A {
   Object attributeD;

   void setAttributeD(Object attributeD) { this.attributeD = attributeD; }
   Object getAttributeD() { return attributeD; }
}

class B extends A {
   B(Object attributeD) { this.attributeD = attributeD; }
}

class C extends A {
}

継承を使いすぎないでください。多くの場合、必要に応じて物事がより複雑になります。あなたはすでにあなたの質問でこれを見ることができます。

于 2012-11-28T09:23:51.647 に答える
0

A のフィールドを保護するか、非公開にしてアクセサーを保護します。

したがって、クラス A のユーザーはフィールドにアクセスできませんが、クラス B と C はフィールドを使用でき、アクセサーをパブリックにすることができます。

于 2012-11-28T09:41:09.200 に答える
0

これを見てください:

Class A {
    private int d = 1;

    protected int getD() {
        return d;
    }
}

Class B extends A {
    public void doStuff() {
        B b = new B();
        System.out.println(b.getD());  
    }
}

Class C extends A {
    public void doStuff() {
        C c = new C();
        System.out.println(c.getD());  
    }
}

あなたの主な問題は、ユーザーがアクセスしないようにすることattribute Dです。これを行うには、プライベートに設定attribute Dしてから、保護されたメソッドを宣言して属性にアクセスします。このようにして、サブクラスは属性にアクセスできます。

于 2012-11-28T09:38:57.947 に答える