Извините за плохой заголовок, не могу придумать краткий способ выразить это ..
Я думаю о наличии списка объектов, которые будут иметь определенный интерфейс. Каждый из этих объектов может затем реализовать дополнительные интерфейсы, но нет никакой гарантии, какой объект будет реализовывать какой. Однако в одном цикле я хотел бы иметь возможность вызывать методы любого дополнительного подтипа.
Т.е. 3 интерфейса:
public interface IAnimal { ... }
public interface IEggLayer { public Egg layEgg(); }
public interface IMammal { public void sweat(); }
это будет сохранено как
private List<IAnimal> animals= new ArrayList<IAnimal>();
Таким образом, экземпляры, добавленные в список, могут также иметь тип IEggLayer
или IMammal
, которые имеют совершенно не связанные методы.
Мой первоначальный инстинкт должен был бы потом сделать
for(IAnimal animal : animals) {
if(animal instanceof IEggLayer) {
egg = ((IEggLayer)animal).layEgg();
}
if(animal instance of IMammal) {
((IMammal)animal).sweat();
}
}
Но мне всегда говорили, что проверка типов является признаком того, что код действительно должен быть реорганизован.
Поскольку для одного объекта может быть возможным, например, [утконос], что означает, что один doFunction()
здесь не подходит, возможно ли избежать использования проверки типов в этом случае, или это экземпляр, где проверка типов классифицируется как приемлемая?
Может быть, есть шаблон дизайна для этого?
Я также прошу прощения за надуманный пример ...
[Игнорируйте любые синтаксические ошибки, пожалуйста - он предназначен только для Java-подобного псевдокода]
Я добавил lvalue к использованию EggLayer, чтобы показать, что иногда возвращаемый тип важен