Преобразование объекта в объект подкласса без потери ссылок на объект - PullRequest
0 голосов
/ 22 февраля 2019

Это моя первая проблема, которую я не могу решить с помощью поиска.Это общая проблема ООП, но код написан на 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 голосов
/ 22 февраля 2019

То, что вы пытаетесь сделать, к счастью, невозможно (представьте, что ваши объекты начали менять классы в середине вашего кода).Вы можете создать объект подкласса на основе объекта суперкласса (если вы можете разумно заполнить любые пропущенные свойства), но вы не можете превратить существующий объект в его подкласс (так, чтобы ссылочное равенство работало каквы надеетесь в своем примере кода, то есть преобразование myObject повлияет на все списки).

Я не знаю, как вы пришли к этой идее, но где-то по пути вы пошли внизнеправильный путь.Если вы сообщите нам, чего вы пытаетесь достичь, мы сможем предложить вам лучшее решение.

Редактировать: Поскольку вы выполняете шашки и вам нужно собрать часть, у вас есть простой выбор добавленияboolean crowned свойство на куски и написание логики на его основе.

В более сложной ситуации вы можете, например, использовать шаблон стратегии , где у вас будет класс Pieceи они будут иметь свойство Type, которое указывает фактический тип куска.Таким образом, объект, который вы помещаете в списки (Piece), всегда остается одним и тем же, но если вы замените его свойство Type, может показаться, что кусок волшебным образом меняет свой тип!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...