当前位置: 首页 > 知识库问答 >
问题:

如何确定非继承类之间的“父子”关系?

江航
2023-03-14

高尔夫球场示例:我们有类课程TrackTeeHole

public class Course {
    private final List<Track> tracks;
}
public class Track {
    private final Course parent;
    private final Tee tee;
    private final Hole hole;
}
public class Tee {
    private final Track parent;
}
public class Hole {
    private final Track parent;
}

这里有很多为人父母的事情。

  • 球场必须由18条赛道组成,这在高尔夫球场是很正常的

但是我遇到了一个问题。当我尝试调用Track的构造函数时...

public Track(Course parent, Tee tee, Hole hole) {//}

... 我必须同时通过TeeHole的实例,但是。。。

public Hole(Track parent) {//}

... 这些函数的构造函数要求我传递一个Track实例。我陷入了一个递归问题。

我可以通过不再让每个父类成为这些类的成员final来“解决”这一问题,但这让人感觉很不舒服,就像糟糕的做法一样-没有理由不让它们成为final,因为它们在我的用例中永远不会改变。

我能想到的另一件事是,将类似这样的“父子”关系外包给不同类型的管理者;不过,对于做这样的事情也不太兴奋。

问题

处理这种“父子”关系的正确方法是什么,目标是最终确定它们,并简单快速地访问诸如#getParent()之类的方法?

非常感谢。

共有1个答案

乐正意智
2023-03-14

我认为这不可能用final字段实现。您有一些类似于循环依赖的东西-您需要父级来初始化子级,同时在初始化同一父级时需要子级。我能想到的最好办法是将父字段设置为非final,并使用setter方法强制只设置一次字段。

public class Track {

    private Course parent;
    private final Tee tee;
    private final Hole hole;

    public Track(Tee tee, Hole hole) {
        this.tee = tee;
        this.hole = hole;
    }

    public void setParent(Course parent) {
        if (this.parent != null) {
            //already has been set, so not allowing it
            //or throw exception, whatever you need
            return;
        }
        this.parent = parent;
    }
}

这应该使父字段实际上是最终的。

 类似资料:
  • 问题内容: 我想知道如何将某些函数返回的父对象转换为子类。 我不能更改A类。如果可以的话,我可以对A类实现functionIneed,但是由于代码的结构,这是不可能的。 问题答案: Python不支持“广播”。您将需要编写代码,以便它可以适当地进行初始化。

  • 问题内容: 我是使用Maven和Jenkins的新手。我试图继承从父pom到子pom的依赖关系,它显示以下错误: 这是我的父母POM: 这是我的孩子POM: 这是我尝试从父POM继承子POM中的依赖项的方法: 如果我将相同的依赖项放在子POM中,则效果很好。我使用jenkins在nexus中进行安装和部署。我正在使用maven-3.3.9。在詹金斯,我从git中阅读了两个不同的Maven项目中的父

  • 我有一个母公司类别(工具),有三个子公司(股票、债券、Etf)。父类还与类(InstrumentPrice)有一个OneToMany关系。JPA联接策略用于父实体和子实体之间。当一个子项被持久化(例如Stock)时,工具中的一个条目也会自动持久化,并具有所有公共属性。这很好用。但是,如何为类InstrumentPrice创建条目?我是否必须在保存股票后从DB读取实体工具,并使用Instrument

  • 本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以

  • 我是使用maven和jenkins的新手。我正在尝试从父pom继承到子pom的依赖关系,它显示以下错误: 这是我的父母POM: 这是我的孩子波姆: 这是我如何尝试从父POM继承子POM中的依赖关系: 如果我在子POM中放置这些相同的依赖项,它会完美地工作。我使用jenkins在nexus中进行安装和部署。我使用的是maven-3.3.9。在jenkins中,我阅读了git中两个不同maven项目中

  • 我以这种方式在实体结构中使用Joined Hibernate继承映射: 我想先保存一个用户,然后在另一个api中保存一个客户,并将该客户映射到第一个用户。所以我尝试用现有的用户id保存一个新客户: 但是,hibernate使用新生成的id(而不是固定传递的id)生成客户,并生成一个新用户。我的问题是:我怎样才能在孩子的父母之后救他?还是反正又有没有救孩子不救父母?