gpt4 book ai didi

java - 如何在骨架实现(即类)中实现一个接口(interface),其两个实例可以相互依赖,而不需要向下转换?

转载 作者:行者123 更新时间:2023-12-01 14:17:15 25 4
gpt4 key购买 nike

给定一个 Person界面:

public interface Person {
Person getSpouse();
void marry(Person spouse);
}

我做了一个骨架实现:
public abstract class AbstractPerson implements Person {
private Person spouse;
@Override
public Person getSpouse() {
return spouse;
}
@Override
public void marry(Person spouse) {
this.spouse = spouse;
((MarriedPerson) spouse).setSpouse(this);//forced to downcast
}
protected void setSpouse(Person spouse) {
this.spouse = spouse;
}
}

调用 marry(Person spouse) 的缺点与骨架实现是参数 spouse必须是 AbstractPerson 的实例.但是,如果 spouse.marry(this)marry() 内部调用,它将无限循环并以堆栈溢出错误结束

问题:是否可以在没有沮丧的情况下实现结婚(个人配偶)?如何?

最佳答案

你想多了。你的错误是有一个 Person接口(interface), MarriedPersonAbstractPerson类。结婚的行为不会改变你的“人格”,所以它不应该把实例变成另一个类(即 MarriedPerson )。相反,它会更改实例的状态,例如 isMarried()会是真的。

废弃很多并有一个类(class):

public class Person {
private Person spouse; // getters/setters not shown

public boolean isMarried() {
return spouse != null;
}

public void marry(Person spouse) {
this.spouse = spouse;
spouse.spouse = this;
}

public void divorce() {
this.spouse = null;
spouse.spouse = null;
}
}

边注:

更普遍准确的模型将具有 List<Person> spouces , 自 some coutries允许多个配偶。性别也会发挥作用,因为这些国家通常只允许男性拥有多个配偶,并且所有这些配偶都必须是女性(同性婚姻在许多国家是不合法的),所以 Man类将有 List<Female>Female会有 Man spouse .
未命名女性版 Woman是故意的,因为在某些国家/地区,女性在完成青春期之前是允许结婚的,因此从技术上讲不会被归类为女性。

关于java - 如何在骨架实现(即类)中实现一个接口(interface),其两个实例可以相互依赖,而不需要向下转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60959530/

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