2013-05-20 2 views
0

я наткнулся на эту ситуацию, но я не знаю, как справиться с этим правильный путь:Проверьте атрибут подкласса

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 кажется плохой идеей, потому что винты идея оо вверх и интерфейс что оба класса реализуются, это тоже плохая идея, потому что обычный кофе нельзя встряхивать. Итак, как с этим справиться?

+2

Да, это ошибка проектирования - в вашем коде. –

+0

[Релевантно] (http://www.javapractices.com/topic/TopicAction.do?Id=31), если вы собираетесь использовать 'instanceof'. – ajp15243

+0

Это отказ от абстракции или, как я вижу, это амнезия. – andre

ответ

2

Проверка, если m - MyclassWithAwesomeStuff с оператором instanceof.

if (m instanceof MyclassWithAwesomeStuff) 
{ 
    MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m; 
    // Now you can access "awesomeStuff" with "mwas" 
} 
+0

Пожалуйста, смотрите мое обновление в вопросе .. – freakout

1

Просто используйте интерфейс:

interface AwesomeStuffable{ 

    public boolean isAwesome(); 

} 

пусть ваши классы реализуют его:

class MyClass implements AwesomeStuffable{ 

    public boolean isAwesome(){ 

    //your logic here 

    } 

} 

И пусть ваши ArrayList держать только AwesomeStuffable объекты.

+0

Пожалуйста, смотрите мое обновление в вопросе .. – freakout

0

Просто, чтобы получить себе разблокирован, вы можете сделать следующее:

if (m instanceof MyClassWithAwesomeStuff) { 
    if (((MyClassWithAwesomeStuff) m).awesomeStuff) { 

    } 
} 

Но, используя InstanceOf поражения цели наследования и, как представляется, недостаток дизайна, чтобы иметь необходимость проверить этот флаг для только некоторые объекты в list в вашем коде. Если вы расширите контекст, возможно, что-то лучшее может быть предложено.

+0

Пожалуйста, см. Мое обновление в вопросе .. – freakout

Смежные вопросы