0

サブクラスでアクセスしたいプライベートメソッドを持つJavaのクラスからサブクラスを作成しましたが、スーパークラスを変更または編集できません。問題はもちろん彼らがプライベートであるということです。私が自分でスーパークラスを作成し、これらのメソッドをプライベートにする必要がある特定の理由があったとします。サブクラスのコードをコピーできます。しかし、サブクラスを作成するときにそれらを操作できるようにするためのより良い方法はありますか?

4

4 に答える 4

0

スーパークラスメソッドを作成しprotectedます。sub-classパッケージからのみアクセスできます。

privateモディファイアはクラス内でのみアクセスできます。

于 2013-01-13T10:46:53.580 に答える
0

そこで、「extends」を使用して、スーパークラスからメソッドを継承しようとしました。もちろんプライベートですが、サブラスで使用できます。それらを抽象化すると、すべてをプライベートで書き直す必要があります。他の選択肢はありません。

于 2013-01-13T10:48:43.877 に答える
0

これを実行したい理由が潜在的に非常に悪いことを無視すると(プライベート変数の使用に関する契約がないため、変数が変更されない、または完全に消えないという保証はありません!)、おそらくリフレクションを使用してやりたいことができます:

使用:
http ://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredField(java.lang.String )
http://docs.oracle.com/javase/6/ docs / api / java / lang / reflect / AccessibleObject.html#setAccessible(boolean
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#get(java。 lang.Object

Class c = object.getClass();
Field field = c.getDeclaredField("somePrivateInstanceVariable");
field.setAccessible(true);
Object someValue = field.get(object);

私はあなたがこれをする理由を考慮しそしてそれに反対することを決定するべきであることを強調したいだけです!拡張するコードを所有している場合は、代わりに。のprotected代わりにフィールドを作成する必要があるかどうかを検討してくださいprivate。OOPの原則に違反することにアクセスできないはずのコードにフックすると(カプセル化を回避している)、アプリケーションが依存しているコードがライブラリの更新で消えないという保証はありません(つまり、また、ライブラリの固定バージョンに自分自身をロックダウンします)。

于 2013-01-13T11:16:28.800 に答える
-1

あなたの場合、代わりにプライベートメソッドを保護されていると宣言する必要があります。主題の詳細については、これをお読みください。

于 2013-01-13T10:49:01.723 に答える