1
//cls_a is defined by system framework, so we cannot change its definition
public class cls_a {
  public void method_a();
}

//I add a new cls_b implemenation and would like to 
//add a new method_a(int) function
//and prevent client side to access cls_a.method_a()
public class cls_b extends cls_a {
  public void method_a(int a) {
    //do something for a
    method_a();
  }
}

//client side
cls_b b = new cls_b();
b.method_a(2); //it's okay
b.method_a(); //should give something error when compiling code

クライアントcls_b側でb.method_a(). Javaでそれを行う方法を知っている人はいますか?

4

6 に答える 6

3

私が今していることは、@ Deprecatedアノテーションをmethod_a()に追加することです(以下の例を参照)。これにより、クライアント側に警告が表示されます。警告は無視しやすいので、コンパイラにエラーを出させる方法はありますか?

public class cls_b extends cls_a {
  //add @Deprecated 
  @Deprecated @Override public void method_a() {
    super.method_a();
  }
  public void method_a(int a) {
    //do something for a
    method_a();
  }
}

于 2013-01-20T05:20:17.953 に答える
2

継承されたメソッドの可視性を下げることができないため、これを行うことはできません (たとえば、パブリックの場合、プライベートにすることはできません)。

Java サブクラスのメソッドの可視性を下げられないのはなぜですか? その理由を説明します。

于 2013-01-20T05:11:14.517 に答える
2

公開すると、そのスコープはプロジェクト全体で利用可能になります。public 関数を特定のクラスから非表示にする方法はありません

更新:あなたの質問をもう一度読みました。b から method_a() を呼び出すときに他の開発者が必要だと思いますが、例外が発生します。それがあなたが望むものなら、あなたは試すことができます

package com.test;


public class ClassA {
    public static void main (String args[]) {
        ClassB b = new ClassB();
        b.print();
    }
}

class ClassC {
    public void print() {
        System.out.println("printA");
    }
}

class ClassB extends ClassC {

    public void print() {
        try {
            throw new Exception("This method is dead");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void print(int i) {
        System.out.println(i);
    }
}
于 2013-01-20T05:12:23.497 に答える
1

サブクラスでメソッドの可視性を下げることはできません。

JDK は同様の問題を UnsupportedOperationException で解決します。

java.util.Arrays.UnmodifiableCollection

    ...
            public boolean add(E e) {
                throw new UnsupportedOperationException();
            }
    ...

java.util.Collection API は、この種のメソッドを次のようにマークします。optional operation

boolean add(E e) Ensures that this collection contains the specified element (optional operation).
于 2013-01-20T05:47:02.233 に答える
1

この方法で行うことができます: クライアントのラッパー クラスを公開します。

 public class cls_a_Wrapper {
      private cls_a a;

      cls_a_Wrapper(){
          a = new cls_a();
      }  

      //methods
      public void method_a_wrapper(){
           a.method_a();
      }
  }

 public class cls_b extends cls_a_Wrapper {
      public void method_a_wrapper(int a) {

           //delegate to wrapper class method if its allowed
           method_a_wrapper();
     }
  }

したがって、クライアントは cls_a の代わりに cls_a_Wrapper クラスをユーザー クラスする必要があります。

したがって、基本クラスのパブリック メソッドを呼び出すかどうかを制御できるようになりました。これがアダプタ設計パターンです。

パブリック メソッドを呼び出したくない場合:

  • ラッパー クラスでメソッドを提供しないでください。
  • または、ラッパー クラスのメソッドの可視性を変更します

注意: クライアントの元のクラスは存在しません。クライアントはラッパー クラスを基本クラスとして扱う必要があります。

于 2013-01-20T05:17:11.880 に答える
0

クライアントが基本クラスのパブリック関数にアクセスできないようにすることは、適切な選択ではありません。実行時例外または非推奨のメソッドを指定することもできますが、クライアントはcls_a型によってメソッドを呼び出すこともできます。

cls_a a = new cls_b();
//...
a.method_a();

より良い方法は、 のデフォルトの実装を提供することですmethod_a。あなたのコードのために、

public class cls_b extends cls_a {
  public void method_a() {
    this.method_a(0);
  }

  public void method_a(int a) {
    //do something for a
    super.method_a();
  }  
}
于 2013-02-05T01:53:28.273 に答える