0

継承したインスタンス変数をプライベートにする必要があります。これは可能ですか?

IE、スーパークラス「エンティティ」には、intインスタンス変数「health」があります。

サブクラス「ゾンビ」(「エンティティ」を拡張)は、エンティティからヘルス変数を継承し、それをプライベートにする方法を教えてください。他のクラスがヘルス変数に直接アクセスできるようにしたくありません。そのためのメソッドを設定して取得したいと思います。

私が十分に具体的でなかったかどうか教えてください。助けていただければ幸いです。

4

4 に答える 4

3

単純に:できません。

これはスーパークラスの契約を破るでしょう。であるあなたのクラスは、Entityそのスーパークラスのように、という名前のフィールドを公開しますhealthEntityプライベートにする機能がある場合、のインスタンス(Entityのサブクラスのインスタンスを含む)でこのフィールドを使用するすべてのコードは、クラスで壊れます...

可能であれば、スーパークラス(つまりEntity)を変更して、フィールドをプライベートにします。それが一般的な方法です。

于 2012-10-06T11:51:02.667 に答える
2

サブクラス内のスーパー クラスのインスタンス変数またはメソッドの可視性を下げることはできません。

スーパー クラスに.. があるとします。また、サブ クラスpublic methodの可視性を下げることが許可されているとします。private

次に、このようなオブジェクトを作成し、そのスーパー クラスのメソッドにアクセスするとどうなるかを確認します。

SuperClass obj = new SubClass();
obj.pubMethod();

ここで、コンパイル時に、コンパイラはメソッドpubMethod()が で公開されSuperClassていることを確認し、アクセスを許可します。RHS ではチェックしないことに注意してくださいinstance type

実行に、インスタンスが であることを JVM がチェックするSubClassと、呼び出そうとする実際のメソッドがSubClass..

しかし、待ってください.. あなたが作ったものJVMを探しに行っpubMethodたときに何が起こったのか見ました..BOoooooMMM - Aクラッシュ..SubClassprivate

だからこそ許されない..

だから、あなたはそれをプライベートにすることはできません..

JLSセクションから- 8.4.8.3: -

オーバーライドまたは非表示のメソッドのアクセス修飾子 (§6.6) は、少なくともオーバーライドまたは非表示のメソッドと同じ量のアクセスを提供する必要があります。そうしないと、コンパイル時エラーが発生します。さらに詳細に:

  • オーバーライドまたは非表示のメソッドがパブリックの場合、オーバーライドまたは非表示のメソッドはパブリックである必要があります。そうしないと、コンパイル時エラーが発生します。

  • オーバーライドまたは非表示のメソッドが保護されている場合、オーバーライドまたは非表示のメソッドは保護またはパブリックである必要があります。そうしないと、コンパイル時エラーが発生します。

  • オーバーライドまたは非表示のメソッドにデフォルト (パッケージ) アクセス権がある場合、オーバーライドまたは非表示のメソッドはプライベートであってはなりません。そうしないと、コンパイル時エラーが発生します。

于 2012-10-06T11:51:26.863 に答える
2

スーパークラスで変数をプライベートにし、すべてのサブクラスがアクセサ メソッドを使用できるようにします。

2 番目の選択肢は、それをパッケージ プライベートにして、アクセスを拒否するクラスを別のパッケージに配置することです。これは、ゾンビが特にエンティティに近い (多くの内部を共有している) 場合に理にかなっていますが、他のクラスはスーパークラスにより疎結合されています。

于 2012-10-06T11:53:10.527 に答える
1

サブクラスのインスタンス変数に制限を追加することはhealthできません。protectedEnitityprivateZombiepublic

ただし、ヘルスを作成privateして、そこにゲッターとセッターEntityを定義することはできます。protectedサブクラスはこれらのメソッドを使用できます。

于 2012-10-06T11:54:12.250 に答える