Java "расширяет" объект - PullRequest
       21

Java "расширяет" объект

0 голосов
/ 09 ноября 2010

Я только недавно вернулся к программированию на Java и в настоящее время застрял с определенной проблемой.

У меня есть объект определенного типа:

StandardClass stdClass = (StandardClass)request.getAttribute(ATTR);  

Но теперь мне нужносделайте Object stdClass Наблюдателем некоторого Observable.
Поскольку StandardClass не реализует интерфейс Observer, я не могу добавить его в качестве наблюдателя напрямую.Поэтому я попытался:

ExtendedClass extends StandardClass implements Observer { ... }

Но я не смог найти способ привести оригинальный объект в новый класс.

Возможно, весь этот подход совершенно неверен, и я в настоящее времяЯ не вижу леса за деревьями, поэтому я буду признателен за любую информацию о том, как решить эту проблему.

Заранее большое спасибо за ваше время и помощь, я действительно ценю это !!

Приветствия,
Томас

Ответы [ 4 ]

3 голосов
/ 09 ноября 2010

Вы не сможете преобразовать исходный объект в ExtendedClass, потому что это , а не экземпляр этого класса. Существование подкласса не означает, что экземпляры суперкласса могут быть каким-либо образом приведены в эти подклассы. В этом случае ваш stdClass объект является экземпляром только StandardClass, поэтому он не может быть успешно понижен.

РЕДАКТИРОВАТЬ, чтобы уточнить: Конечно, некоторые объекты, хранящиеся в переменных StandardClass, вполне могут быть объектами ExtendedClass. Насколько я понимаю, вы не изменили фактический объект, сохраненный в запросе, просто создали подкласс. Когда вы сказали, что не можете выполнить приведение, я предположил, что вы имеете в виду, что приведение не удалось во время выполнения с ClassCastException (некоторые преобразования будут отклонены компилятором, поскольку они не могут быть успешными, например, Integer никогда не может быть приведен String, но это не должно быть одним из таких случаев). Если вы создали подкласс , а изменили ваше приложение так, чтобы объект, сохраненный в запросе, был создан как объект ExtendedClass, тогда приведение должно завершиться успешно.

Чтобы достичь того, что вы хотите сделать, более чистый подход - это своего рода класс оболочки , который содержит a StandardClass экземпляр и сам реализует методы Observer. Затем он может вызывать соответствующие методы в StandardClass в ответ на наблюдаемые события.

1 голос
/ 09 ноября 2010

Если объект в request.getAttribute(ATTR) действительно является Observable, то вы можете просто привести его так:

Observable obs = (Observable) request.getAttribute(ATTR);

Компилятор не позволит вам преобразовывать один тип в несовместимый, если он знает, что StandardClass не является Observable.Или вы можете просто объявить ссылку как ExtendedClass.

0 голосов
/ 09 ноября 2010

Если вам нужен визуал, взгляните на диаграмму паттернов наблюдателя

http://upload.wikimedia.org/wikipedia/commons/8/8d/Observer.svg

0 голосов
/ 09 ноября 2010

При вашем подходе:

request.getAttribute(ATTR);

Должен возвращать тип объекта ExtendedClass, чтобы привести его к Observer, например:

Observer observer = (Observer) request.getAttribute(ATTR);
...