0

クラスC が B を拡張しています。B は Aを拡張します。A には属性nameがあります。Cクラスでname属性を見たくない。

どうすればそれを無視できますか?

PS: Java でそれができない場合: 私は Apache CXF を使用し、Web サービス機能を持つ Spring プロジェクトに取り組んでいます。クライアントから B 型オブジェクトを取得し、C 型オブジェクトをクライアントに送信したい。設計上の問題があるため、継承メカニズムを変更したくありません。Cクラスのnameフィールドを無視する方法があれば教えてください。私は最初のコード スタイルとして実装しています。

4

3 に答える 3

1

nameフィールドをAasで宣言しprivate、A と B の両方を同じパッケージに保持できます。

package A;
Class A {

 protected String name;

}



Class B extends A{
   // B can access A's attribute
   }



package C;


    Class C extends B{
       // C cannot access name attribute defined in A.
     }

そして、Cは別のパッケージに入れておきます。

于 2012-06-05T10:09:22.810 に答える
1

継承よりも構成について読んでください。一部の要素を非表示にする必要がある場合は、オブジェクト指向のコード設計を正しく理解していない可能性があります。

あなたが提供した例は狭すぎて、より良い答えを作成できません。しかし、C を A にキャストしてまだ使用できるのに、C に隠す意味は何ですか?

于 2012-06-05T10:18:50.543 に答える
0

クラスC が B を拡張しています。B は Aを拡張します。A には属性 nameがあります。Cクラスでname属性を見たくない。

編集に基づいて、サブクラス (C) の 1 つのシリアル化された表現で、スーパークラス (A) から属性を非表示にしようとしています。JAX-WS/JAX-RS を使用していると仮定すると、サブクラスのプロパティをオーバーライドし、注釈を適用してシリアライゼーションの対象外としてマークすることで、これを行うことができます。適用する主要なアノテーションは、JAXB アノテーション @XmlTransient です。オブジェクトを JSON としてシリアル化するオプションを提供している場合は、プロパティを @JsonIgnore することもできます。以下に示す疑似コード:

@XmlRootElement
public class A implements Serializable {
    private String name;

    // ...
}

@XmlRootElement
public class C extends A {

    @Override
    @XmlTransient
    public String getName() {
        return super.getName();
    }
}
于 2012-06-05T10:44:18.780 に答える