web-dev-qa-db-ja.com

同じスーパークラスオブジェクトからのインスタンスの作成

同じスーパークラス(State)から派生した3つのサブクラス(LowState、MediumState、HighState)があります。

スーパークラスのState内で、3つのサブクラスからアクセスおよび変更する必要があるいくつかの変数を宣言しました。

これらの3つのサブクラスオブジェクトを同じスーパークラスオブジェクトからインスタンス化して、それらがすべて同じから変数にアクセスできるようにすることは可能ですか?オブジェクト?

または、各サブクラスで変数を宣言して、オブジェクト間でデータを受け渡すこともできます。ただし、このchainingメソッドが手に負えなくなる可能性があることを心配しています。

3
M-R

スーパークラスのState内で、3つのサブクラスからアクセスおよび変更する必要があるいくつかの変数を宣言しました。

それがprotected修飾子の目的です。

「#私と私のサブクラス...」。

同じ3つのサブクラスオブジェクトを同じ「スーパークラスオブジェクト」からインスタンス化して、すべての変数にアクセスできるようにすることはできますか。

保護された修飾子から取得すること。

...同じオブジェクトから?

さて、それは奇妙な(そして危険な)ことをしたいように聞こえます。

なぜこれらの値を変更したいのですか?さまざまなサブクラスからの変更を管理するために、あらゆる種類の問題に直面する可能性があります。

reallyがこれを実行したい場合、static修飾子might必要なものを取得しますが、(特にユニットテスト/モッキングで)対処する他の「新しくてエキサイティングな」問題が山積みになる可能性があります。

2
Phill W.

同じ「スーパークラスオブジェクト」からこれらの3つのサブクラスオブジェクトをインスタンス化して、同じオブジェクトの変数にすべてアクセスできるようにすることは可能ですか?

いいえ。ただし、デフォルトでメンバーが特定の値に設定されているStateからインスタンス化でき、その結果、サブクラスはすべて同じ値になります。

public class State {
   protected int stateValue = 1;
}

public class SubState extends State {
   // stateValue will be '1' here...
}

継承ではなく「構成」を使用した場合、「SubState」オブジェクトをインスタンス化することができます参照同じ「状態」オブジェクト。ただし、そのオブジェクトを複数のサブクラス化されたオブジェクト間で共有する場合は注意が必要です。これは、安全性や直感性に優れているとは言えません。

以下のコメントに注意してください。compositionは、状態変化を共有する手段を提供します。

public class SubState(State state) {
   // 'state' could be shared across multiple substates here...
}

また、参照しているスーパークラス/サブクラスの関係は必要ありません。

0
Brian Agnew