Java - Коллекция абстрактного класса, дети содержат разрозненные объекты - Есть ли "хороший" способ обработки этих обернутых объектов?

Допустим, у нас есть что-то вроде этого:

public abstract class MyClass {
    //Stuff in here
}

public class MyClassA extends MyClass {

    private String thingie; //Along with getter/setters, of course
    //Other stuff
}

public class MyClassB extends MyClass {

    private List<Integer> thingies; //Again, getters and setters to go with
    //Other stuff
}

Давайте предположим, что у нас есть любое количество классов, расширяющих MyClass, каждый со своей собственной переменной экземпляра другого типа, хотя некоторые могут иметь один и тот же тип. Это печальная необходимость. Теперь предположим, что у нас есть коллекция MyClass. У нас есть коллекция, заполненная любым количеством дочерних классов, в каждом из которых содержится объект. Допустим, мне нужно перебрать эту коллекцию, извлечь указанный объект из любого количества элементов и выполнить над ним какие-либо действия, сохранить его, манипулировать им, отправить его в другое место и т. Д. Эти объекты не имеют ничего общего, кроме расширения Object.

Я мог бы просто делегировать эти действия самим дочерним элементам MyClass, использовать посетителя и т. Д., Но это, вероятно, неосуществимо, так как эти действия могут зависеть от других дочерних элементов MyClass в Коллекции. Один дочерний элемент MyClass, скорее всего, не будет диктовать действие, которое будет предпринято само по себе, или даже какую-либо отдельную коллекцию MyClass. Некоторые из этих действий могут быть кумулятивными и зависеть от ряда других потенциальных кумулятивных факторов.

Есть ли какой-нибудь "хороший" способ справиться с этим, или я просто буду проклят в ад ужасных условий проверки типов или чего-то подобного? Я подумал об использовании Generics в MyClass и использовании конкретных типов для всех детей. Это может упростить поиск объектов, но все равно потребует большого условного блока.

1 ответ

Вы отбросили в своем вопросе "хороший" способ сделать это. Обобщения не помогут в этом случае. Да, вы будете прокляты в грязном месте за уродливое использование проверки типов. Вы можете замаскировать проверку типов, используя общий член экземпляра, который называется, скажем, category и соответствующий ему аксессор getCategory определяется в MyClass, И они делают switch если можно (вместо нескольких ifs) на getCategory(), Тем не менее, люди, которые будут осуждать вас, могут не понравиться ifс и switches независимо от того, проверяют ли они типы или нет. И они также могут быть умными и понимать, что вы пытаетесь сделать. Все, кроме

for(MyClass e: collection )
    e.doYourAction();

плохо".

Теперь, для программного обеспечения, которое, кажется, не имеет никакой спецификации, вы можете быть помилованы.

Другие вопросы по тегам