gpt4 book ai didi

java - 将对象转换为子类对象而不丢失对该对象的引用

转载 作者:行者123 更新时间:2023-12-02 10:13:44 25 4
gpt4 key购买 nike

这是我的第一个问题,我无法通过搜索解决。这是一个一般的OOP问题,但代码是用java编写的。也许我错过了一个要点?

假设有一个基类和一个子类。基类的对象存在于许多列表中。有一个转换器类,其职责是将对象转换为子类对象。变压器不应该知道有关列表的任何信息。但作为转换的结果,新的子类对象应该位于所有列表中。 (替换原来的基类对象)

这可以以某种方式完成吗?

class BaseClass {
//
}
class SubClass extends BaseClass{
//
}
class Transformer{
BaseClass base;
public Transformer(BaseClass base){
this.base = base;
}
public void transform(){
//transforms the Object to a subtype-object
// ???
// (move the references of the old object to the new one)
this.base = new SubClass(); //something like this (but not so!!!)
}
}


class Programm{
private List<BaseClass> list1 = new ArrayList<>();
private List<BaseClass> list2 = new ArrayList<>();
private List<BaseClass> list3 = new ArrayList<>();
//many more Lists
private List<BaseClass> listn = new ArrayList<>();



public void main() {
BaseClass myObject = new BaseClass();
list1.add(myObject);
list2.add(myObject);
list3.add(myObject);
listn.add(myObject);

Transformer transformer = new Transformer(myObject);
transformer.transform();

//required result
// All Lists contain the transformed Object (from Type SubClass)
}
}

最佳答案

幸运的是,您想要做的事情是不可能的(想象一下,如果您的对象开始在代码中间更改类)。您可以基于父类(super class)对象创建子类对象(如果您可以明智地填充任何缺少的属性),但您不能将现有对象转换为它的子类(这样引用相等性就可以工作)正如您在示例代码中所希望的那样,即转换 myObject 会影响所有列表)。

我不知道你是怎么想到这个想法的,但在这个过程中你已经走错了路。如果您告诉我们您想要实现的目标,我们可以为您提供更好的解决方案。

编辑:由于您正在做西洋跳棋并且需要给棋子加冕,因此您可以简单地选择向棋子添加 boolean 加冠属性,并基于该属性编写逻辑。

在更复杂的情况下,您可以使用 strategy pattern ,其中您将有一个 Piece 类,并且它们将有一个 Type 属性来指定该片段的实际类型。这样,您放入列表中的对象 (Piece) 始终保持不变,但如果您替换其 Type 属性,则该 block 看起来就像神奇地改变了它的类型!

关于java - 将对象转换为子类对象而不丢失对该对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54822095/

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