2013-07-05 3 views
0

Я работаю над немного Java, и я не совсем уверен, как решить эту проблему, по крайней мере, не без уродства, чего я бы хотел избежать. У меня есть родительский абстрактный класс, допустим, Item. Элемент имеет три подкласса ItemA, который является конкретным, и еще один абстрактный класс ItemB, который сам имеет два конкретных дочерних класса: ItemB1 и ItemB2. ItemA - это просто заглушка и может не понадобиться, если элемент сам по себе может стать конкретным, но я не был уверен, нужен ли заглушка или нет в зависимости от решения. Все они должны наследовать от элемента или родительского интерфейса, поскольку они будут сидеть в нескольких Коллекциях.Иерархия типов + необязательное поле

Теперь у нас есть эта иерархия предметов. Интересная часть состоит в том, что элементы имеют необязательное поле объекта, скажем, это объект, называемый Функциональность. Любой из конкретных классов потенциально может иметь объект Functionality, но некоторые не будут. Это должно быть на некоторых, но не должно существовать на других. Я бы хотел, чтобы это не похлопывало его по Item и nullchecking все время, чтобы увидеть, есть ли он там. Это возможно, но кажется мне немного уродливым. Я не думаю, что разделение иерархии на два отдельных дерева действительно возможно, так как я в основном дублировал бы кучу классов с одним куском дополнительных данных.

Что делать в таком случае? Первоначально я думал об использовании декоратора, но это означало бы, что проверка типов как сумасшедшая, если бы это был FunctionalityDecoratedItem или somesuch каждый раз, когда мне нужно было видеть, имеет ли он поле Functionality, и я уже делаю немного проверки типов, чтобы определить, что делать различные подтипы предмета. Может быть, я просто занимаюсь этим (иногда у меня есть склонность к зависанию на мелких деталях), или, может быть, есть очевидное решение, что мой нос блокирует, но я надеюсь, что я просто пропустил образец или технику, которые может осуществить это чисто.

ответ

2

Определить интерфейс. Некоторые классы реализуют интерфейс, другие - нет. Вы можете использовать instanceof, чтобы проверить, реализует ли объект интерфейс во время выполнения.

+0

Возможно, я должен упомянуть, что всем им нужно реализовать общий интерфейс, поскольку будет несколько случаев, когда будут использоваться коллекции интерфейса. Объявив один интерфейс и разделив его на два набора, один с функциональностью и один без другой пары интерфейсов, закончится с большим количеством дублирования и упростит обслуживание. – user1017413

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