0

外部から呼び出したくないパブリックメソッドを持つライブラリクラスを拡張しています。「new」キーワードを使用して非表示にできることはわかっていますが、問題は、さまざまな宣言がたくさんあることです。このようなもの:

class Parent() {
  public double method(double a, double b) { ... }
  public int method(int a, int b) { ... }
  public System.Int32 method(System.Int32 a, System.Int32 b) { ... }
}

今私はできる:

class Child() {  
  // Make method private.
  private new double method(double a, double b) { return base.method(a, b) }
  private new int method(int a, int b) { return base.method(a, b) }
  private new System.Int32 method(System.Int32 a, System.Int32 b) { return base.method(a, b) }

  /// Own Code.
}

しかし、その関数のすべてのオーバーライドを非公開にする簡単な方法がないかどうか疑問に思っています。

4

3 に答える 3

2

最初の質問は、子孫クラスを親としてキャストする必要があるかどうかだと思います。

そうでない場合、最善の方法は、「親」を非表示にして、メソッドを介したアクセスのみを許可するファサード パターンを使用することです。

のようなもの:

class Parent {
  public double method(double a, double b) { ... }
  public int method(int a, int b) { ... }
}


class YourStuff {
  private Parent _parent = new Parent();

  public int AddNumbers(int a, int b) {
     return _parent.method(a,b);
  }
}

この場合、Parent クラスは隠されています。

于 2012-12-27T23:53:17.717 に答える
1

これは、メソッドの非表示が機能する方法ではありません。private newメソッドは、クラス内の元のメソッドのみを非表示にしますChild(ただし、非表示にしたものを呼び出すため、何も得られません)。

Grandchildから派生したクラスでは、メソッドがスコープ内にChildないため、何も隠されていません。したがって、のメソッドは完全に呼び出し可能であり、「ネイキッド」です。メソッドを非表示にしても、非表示のメソッドは削除されません。同一のメソッドのどれが呼び出されるかだけが問題です。private newpublicParent

于 2012-12-27T23:18:48.517 に答える