这是我无法通过搜索解决的第一个问题。这是一个普遍的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)
}
}
答案 0 :(得分:1)
幸运的是,您尝试做的事情是不可能的(想象一下,如果您的对象开始在代码中间更改类)。您可以基于超类对象创建子类对象(如果您可以合理地填写任何缺少的属性),但是您不能将现有对象变成到其子类中(这样引用相等性就可以工作)如您希望的那样,例如转换myObject
会影响所有列表。
我不知道您是怎么想到这个主意的,但是您一直走在错误的道路上。如果您告诉我们您要达到的目标,我们可以为您提供更好的解决方案。
编辑:
由于您要进行检查,因此需要加冠,您可以简单地选择在片段上添加boolean crowned
属性,然后基于该属性编写逻辑。
例如,在更复杂的情况下,您可以使用strategy pattern,其中您将拥有一个Piece
类,而他们将拥有一个Type
属性,该属性指定了实际的片。这样,您放入列表(Piece
)中的对象始终保持不变,但是如果替换其Type
属性,就好像该对象已神奇地改变了它的类型!