2

申し訳ありませんが、質問は以前に私が適切に述べていませんでした。Factory Pattern を実装しようとしています。より良い例: create 関数を持つ抽象クラス Human です。create に渡された引数に基づいて、サブクラス Man のインスタンスを返すか、サブクラス Woman のインスタンスを返すかを決定します。Human john = Human.create("Man"); サブクラスの Man と Woman は抽象クラス Human から継承され、Human と同じファイルで定義されます。 次の方法で拡張できるようにしたくありませんHuman lisa = new Human("woman") {};。メインプログラムから。ありがとう!

編集:

助けてくれてありがとう!私が最終的に使用した解決策は、クラス Human をパブリックにし、その関数を作成することでした。Human コンストラクターと Man および Woman クラスは、「パッケージで保護されている」と宣言されています。

4

2 に答える 2

1

Aのクラス宣言で可視性指定子を使用しないでください。これはパッケージアクセスクラスになります。

問題の変更を反映するように編集します。

オプション1:Humanパッケージのコンストラクターをプライベートにします。これを行うことにより、パッケージの外部にHumanを拡張しようとするクラスは、スーパークラスのコンストラクターを呼び出すことができないため、失敗します。

オプション2:パッケージプライベートクラスの私の最初の提案に固執し、代わりにパブリックアクセスファクトリクラスを使用します。

于 2010-04-22T16:14:34.577 に答える
0

それは、不可能とは何を意味するかによって異なります。静的に強制したい場合、それを行う唯一の方法はクラスパッケージにアクセスさせることですが、それは匿名クラスを特に制限するのではなく、名前付きクラスも制限します. 実行時に強制したい場合は、抽象クラスのコンストラクターでこれを行うことができます

 if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) {
     throw new IllegalStateException("This class cannot be used as an anonymous inner class");
  }
于 2010-04-22T16:20:45.207 に答える