1

(jar内で)変更できないクラスがある場合、例:

public class AA implements A{
  private String s = "foo";
  public String getValue() { return s; }
}

そのgetValue()メソッドをオーバーライドするための良い方法は何でしょうか?私のやり方は、クラスを再コピーすることです。元。

public class AB implements A{
  private String s = "foo";
  public String getValue() { return s + "bar"; }
}

ありがとう!

4

3 に答える 3

5

何をしても、プライベート変数にアクセスすることはできません(リフレクションなしで)。その値が必要な場合は、ゲッターでスーパークラスのゲッターを呼び出して値を取得し、必要に応じて操作します。スーパークラスのメソッドを呼び出すには、次のようにします。

super.getValue();

getValue実装内。

あなたの更新を考えると

public class AB extends AA {
  public String getValue() { 
      String superS = super.getValue();
      return superS + "bar"; 
  }
}

次の点に注意してください

1)使用していないImを使用しextendsています。extendsクラスを拡張するためのものでimplementsあり、インターフェースを実装するためのものです。
2)シャドウイングしていませんs。私はそれをスーパークラスに残します。getValue私はあなたが指定した装飾と組み合わせてスーパーを使用します。

于 2012-07-06T18:40:00.503 に答える
4

これを修正する方法は2つあります。

1)継承を使用します。

public B extends A{
    public String getValue(){
     String s = super.getValue();
     // do something with s
     return s;
  }
}

Bこれは正常に機能しますが、ユーザーはから継承Aとしてにキャストできます。つまり、クラスから引き続きアクセスできますが、それはあなたが望んでいることではありません。BAA.getValue()B

2)もう1つの解決策は、アダプタパターンを使用することです。

public B {
  private A a = new A();
  public String getValue(){
     String s = a.getValue();
     // do something with s
     return s;
  }
}

このように、それBを使用Aして非表示にします。toのキャストは不可能であり、 BtoAの呼び出しはA.getValue()利用できません。

于 2012-07-06T18:46:39.090 に答える
0

それがカプセル化の目的です...あなたの例は、OCP(Open Closed Principle)という名前の設計原則を示しています。

つまり、クラスは変更のためではなく、拡張のために開かれています。jarメソッドを使用してそのプライベート変数にアクセスできますが、不正な方法で変更することはできません。

スーパークラスのgetterメソッドにアクセスするだけで、スーパークラスのプライベート変数にアクセスできます。

于 2012-07-06T18:43:39.667 に答える