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

时间:2019-02-22 07:28:44

标签: java oop

这是我无法通过搜索解决的第一个问题。这是一个普遍的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)
    }
}

1 个答案:

答案 0 :(得分:1)

幸运的是,您尝试做的事情是不可能的(想象一下,如果您的对象开始在代码中间更改类)。您可以基于超类对象创建子类对象(如果您可以合理地填写任何缺少的属性),但是您不能将现有对象变成到其子类中(这样引用相等性就可以工作)如您希望的那样,例如转换myObject会影响所有列表。

我不知道您是怎么想到这个主意的,但是您一直走在错误的道路上。如果您告诉我们您要达到的目标,我们可以为您提供更好的解决方案。

编辑: 由于您要进行检查,因此需要加冠,您可以简单地选择在片段上添加boolean crowned属性,然后基于该属性编写逻辑。

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