0

次のクラスがあるとします。

public class BodyClass{

private LegClass myLeftLeg;
private LegClass myRightLeg;
private NoseClass myNose;

...

}

後でソフトウェア プログラムのどこかで、myRightLeg の単独のインスタンスを作成します。

では、このインスタンス変数が含まれているクラスは言うまでもなく、この rightleg がどの BodyClass オブジェクトに関係するのかを簡単に (またはまったく) わからないのはなぜでしょうか? コンポジション リレーションシップでは、実行時に親クラスに関する情報が自動的に子オブジェクトに格納されないのはなぜですか?

Java が各クラス変数に親クラス自体に関する情報を遅延ロードする世界はあり得ないのでしょうか?

なぜこれが悪いのでしょうか?そして、これはかなり確かな利点ではないでしょうか?

サブクラスはスーパークラスについて何も知らなくていい、インスタンス変数は親クラスについて何も知らなくていい、などと人々が言うのを耳にしますが、率直に言って、そうすべきではない理由がわかりません。

私の質問はこの質問に関連しています:

Javaで特定のクラスのすべてのサブクラスを見つけるにはどうすればよいですか?

4

3 に答える 3

1

では、このインスタンス変数が含まれているクラスは言うまでもなく、この rightleg がどの BodyClass オブジェクトに関係するのかを簡単に (またはまったく) わからないのはなぜでしょうか?
...
コンポジション リレーションシップで、実行時に親クラスに関する情報が自動的に子オブジェクトに格納されないのはなぜですか?

言語仕様にはこの要件が含まれていないためです。

Java では、オブジェクトがフィールドとして明示的に与えられるか、継承されたフィールドとして暗黙的に与えられない限り、オブジェクトは他のオブジェクトへの参照を含みません。それでおしまい。オブジェクトに、どのオブジェクトが自分について知っているかを知らせたい場合は、自分でプログラムする必要があります。

class LegClass {
    private BodyClass body;

    void setBody(BodyClass body) {
        this.body = body;
    }
}

class BodyClass {
    // snip...
    void setRightLeg(LegClass rightLeg) {
        this.myRightLeg = rightLeg;
        rightLeg.setBody(this);
    }
}

これにより、2 つのクラス間に密結合が生じることに注意してください。密結合は一般的に良いことではありません

これが特に便利な理由がわかりません。そのような「機能」は、カプセル化単一の責任など、OOP (Java が支持する) の一部の原則に違反する方向に向かいます。どのインスタンス (複数可) を参照するか (1 つだけである必要はないことを忘れないでください!) を参照するフィールドは、通常、コードのにおいです。

于 2013-09-22T05:03:24.753 に答える
0

合成手段 HAS A 継承手段 IS A

例: 車にはエンジンがあり、車は自動車です

プログラミングでは、これは次のように表されます。

class Engine {} // エンジン クラス。

class Automobile{} // Car クラスの親である Automobile クラス。

// Car は Automobile であるため、Car クラスは Automobile クラスを拡張します。クラス Car は Automobile を拡張します{

// Car には Engine があるため、Car クラスには Engine クラスのインスタンスがメンバーとして含まれます。プライベート エンジン エンジン; }

于 2016-05-28T16:28:36.883 に答える