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
если можно (вместо нескольких if
s) на getCategory()
, Тем не менее, люди, которые будут осуждать вас, могут не понравиться if
с и switches
независимо от того, проверяют ли они типы или нет. И они также могут быть умными и понимать, что вы пытаетесь сделать. Все, кроме
for(MyClass e: collection )
e.doYourAction();
плохо".
Теперь, для программного обеспечения, которое, кажется, не имеет никакой спецификации, вы можете быть помилованы.