gpt4 book ai didi

java - Java 中的组合

转载 作者:行者123 更新时间:2023-12-02 06:42:58 25 4
gpt4 key购买 nike

假设我有以下类(class):

public class BodyClass{

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

...

}

稍后在软件程序深处的某个地方,我将有一个 myRightLeg 的单独实例。

现在,为什么我不容易(或根本不知道)这个右腿属于哪个 BodyClass 对象,更不用说这个实例变量包含在哪个类中了?为什么在组合关系中,运行时父类的信息不会自动存储在子对象中?

难道 Java 不能延迟加载每个类变量以及有关父类本身的信息吗?

为什么这会很糟糕?这难道不是一个相当可观的好处吗?

我听到人们说子类不应该知道有关其父类(super class)的任何信息,实例变量不应该知道有关其父类的任何信息,但坦率地说,我不明白为什么不这样做。

我的问题与这个问题相关:

How do you find all subclasses of a given class in Java?

最佳答案

Now, how come I won't know easily (or at all) which BodyClass object this rightleg pertains to, let alone which Class this instance variable is contained in?
...
Why is it that in composition relationships, the information about the parent class is not automatically stored in the child objects, at runtime?

因为the language specification不包括此要求。

在 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);
}
}

注意 tight coupling这介绍了两个类之间的情况。 Tight coupling is generally not a good thing.

我不明白为什么这特别有用,而且这样的“功能”会违反 OOP(Java 拥护的)的一些原则,例如 EncapsulationSingle Responsibility 。知道哪个实例(记住,没有理由它必须只有一个!)引用它的字段通常是一种代码味道。

关于java - Java 中的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com