2012-06-24 4 views
1

Итак, я работаю над проектом с абстрактным классом A. Предположим, что классы a1, a2 и a3 все наследуют от класса A с некоторыми дополнительными методами, которые могут быть уникальными для каждого подкласс. Теперь эти объекты могут быть сопряжены с другими объектами в результате взаимодействия с пользователем, но могут быть сопряжены только определенные типы объектов, т. Е. Объект B может использовать только a1, объект C может использовать только a2, а попытка пользователя пара в противном случае приводит к тому, что они сообщают им, что они не могут. Я, конечно, хотел бы избежать примера, поскольку это в значительной степени плохая практика, но я думаю, что у меня сейчас довольно неприятный случай мозгового метеоризма. Я думал о добавлении getType() или некоторого такого метода в родительский класс, чтобы возвращать строку, уникальную для каждого подкласса, но которая кажется избитой. Схват названия класса чувствует то же самое. Я немного ржав на своих принципах ОО и полиморфизма, поэтому предложения приветствуются.Наследование и определение типов объектов в Java

+0

У меня нет проблемы с использованием instanceof в этом случае, это считается плохой практикой, когда вы используете его для проверки типов во время выполнения, когда их нужно проверять во время компиляции, но вы говорите, что это пользователь, который будет выполнять сопряжение (следовательно, время выполнения), поэтому instanceof кажется хорошим выбором – ilcavero

ответ

0

Я думал о решении, используя дженерики для этого случая.

Для этого вам нужно будет определить класс, который хранит два значения genericly как

класс Пара < к, v расширяет A>

Теперь вы будете добавлять к HashMap всех типов пар вы могу иметь. Когда вам понадобится пара этого типа, вы получите пару по ее имени.

Минусы:

Вы должны добавить в контейнер все требуемые пары

Вы должны связать пару имя

Обратите внимание, что в огромном масштабе это было бы плохим решением.

2

Если вы действительно не используете instanceof, и по какой-либо причине вы не можете определить параметр для сопряжения за пределами класса экземпляра, добавьте в абстрактный класс набор новых методов, которые делают один из двух вещи:

a) метод работаетWithTypeB, worksWithTypeC и т. д., определяя их в подклассах в зависимости от ситуации. Однако это очень похоже на проверку типов.

b) передать методы, которые будут использоваться типами B и C абстрактному классу; обычно определяйте их в классах, которые могут использоваться B и C (так что предположим, что тип B использует a1.methodB, а тип C использует a2.methodC), но определите их для исключения исключения, которое в методах, которые не будут существуют иначе (поэтому a1.methodC генерирует исключение, как и a2.methodB).

Хотя, как сказал ilcavero, в этом случае нет ничего плохого в typechecking.

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