Есть ли хороший способ расширить список так, чтобы каждый добавленный элемент конвертировался первым? - PullRequest
0 голосов
/ 23 января 2020

В основном у меня есть следующее:

public class BaseClass {}

public class SubClass extends BaseClass {
    public SubClass(BaseClass bc) {...} // converts BaseClass Element to SubClassElement
}

public class BaseList extends ArrayList<BaseClass> {
    Object someOtherAttribute;

    public BaseList(someOtherAttribute) {
         this.someOtherAttribute = someOtherAttribute;
    }
}

Теперь я хочу реализовать класс

public SubList extends BaseList {
    public SubList(Object someOtherAttribute) {
        super(someOtherAttribute);
    }

    @Override
    public void add(BaseClass baseClass) {
        super.add(SubClass(baseClass));
    }

    //the problem is that I would have to override every single Method like addAll() 
    //because otherwise the elements wouldn't get converted ...
}

, который преобразует каждый элемент от BaseClass до элемента Subclass перед добавлением его в список.

До сих пор я не нашел лучшего способа, чем переопределение каждого метода List<BaseClass>

1 Ответ

0 голосов
/ 23 января 2020

Я считаю, что это хороший вопрос, так как он требует размышлений о том, как реализовать пользовательский List. Я и раньше сталкивался с такими потребностями.

Я только что прошел через ArrayList API, чтобы понять это. Вот что, я думаю, можно сделать.

  1. Расширить существующую полную реализацию, скажем, ArrayList.
  2. Переопределить те методы, где новый элемент (ы) добавляется к список. Например, add(), addAll(), set() и др. c. В переопределенном методе вам нужно будет выполнить преобразование и вызвать super.add() (или какой-либо переопределяемый метод).
  3. Реализация хороших equals() и hashcode() на ваших BaseClass и SubClass таким образом, чтобы они не противоречили друг другу. Это необходимо для indexOf(), contains(), et c. чтобы хорошо работать.
  4. Вам придется проверить toArray(), если вы получите ArrayStoreException. Этот бит, я не уверен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...