я наткнулся на эту ситуацию, но я не знаю, как справиться с этим правильный путь:Проверьте атрибут подкласса
class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
public boolean awesomeStuff;
}
Я сохраняю объекты MyClass в ArrayList и перебирать позже этот список :
for(Myclass m : list) {
//here I want to check if awesomeStuff is true, in case it is a MyclasswithAwesomeStuff
}
проблема состоит в следующем: родительский класс Myclass не знает awesomeStuff атрибут (и это не должно, потому что это функция, которая приходит только с производным классом). Но как я могу это сделать? Проблема заключается в том, что arraylist содержит элементы Myclass и MyclassWithAwesomeStuff, а цикл foreach всегда ставит их в Myclass.
Интересно, является ли это сбой конструкции?
// EDIT:
Хорошо, чтобы сделать мой вопрос немного более ощутимым, здесь более подробная информация. Я пытаюсь построить небольшое кафе:
class Coffee { }
class CoffeeMix extends Coffee {
public boolean shaken;
}
Я спасаю элементы кофе в списке массива:
ArrayList<Coffee> coffees = new ArrayList<Coffee>();
Таким образом, в этом списке массива существует нормальные объекты кофе и объекты кофе микса , Теперь я хочу, чтобы отобразить все объекты кофейной смеси, которые потрясли:
for(Coffee c : coffees) {
//here is the same problem as above
}
Как я могу видеть из ответов/комментариев: InstanceOf кажется плохой идеей, потому что винты идея оо вверх и интерфейс что оба класса реализуются, это тоже плохая идея, потому что обычный кофе нельзя встряхивать. Итак, как с этим справиться?
Да, это ошибка проектирования - в вашем коде. –
[Релевантно] (http://www.javapractices.com/topic/TopicAction.do?Id=31), если вы собираетесь использовать 'instanceof'. – ajp15243
Это отказ от абстракции или, как я вижу, это амнезия. – andre