Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Почему FocusAdapter абстрактный класс?


Автор: Royan 13.5.2005, 17:31
Я не могу понять, что с ним не так, что он стал абстрактным:
Цитата
public abstract class FocusAdapter
extends Object
implements FocusListener

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/FocusAdapter.html
В моем понимании абстрактным классом называется тот класс, объект которого, нельзя получить. То есть что-то препятствует тому, чтобы из класса получился объект. Здесь же есть два метода, оба заимплементированы. Так почему он абстрактный?

Автор: batigoal 13.5.2005, 17:38
Гм... Действительно, абстрактный... Фигня какая-то. Два имплементированных метода, наследуется от Object...
Адаптер не должен быть абстрактным, это противоречит его основному назначению - пустой реализации интерфейсов.

Может, баг?..
Добавлено @ 17:40

Посмотрел - оказывается, все адаптеры абстрактны... Зачем это?

Автор: Stampede 13.5.2005, 17:55
Идея адаптеров обработчиков оконных событий возникла вот каким образом. Что такое листенер - надеюсь, объяснять не надо? Так вот, листенеры определены в виде интерфейсов; каждый тип листенера объявляет ряд характерных для этого типа методов для реакции на определенные события. У некоторых листенеров таких методов меньше, у других - больше. Например, у MouseListener их пять, у WindowListener - семь, и т. д.

Но тебе, допустим, не нужно слушать все WindowEvent'ы: тебя интересует только windowClosing(WindowEvent e). Но поскольку интерфейс листенера - общий для всех слушателей WindowEvent, то тебе таки придется имплементировать его весь, и потом долго заниматься мартышкиным трудом: писать заглушки (пустые методы) для тех методов, которые тебя не интересуют.

Так вот, товарищи из Sun'а весь этот мартышкин труд за тебя уже проделали - написали абстрактные классы, состоящие из пустых определений методов, и назвали их адаптерами. Так что тебе только остается унаследовать от нужного тебе адаптера и переопределить интересующий тебя метод.

А аббстрактными они объявлены для того, чтобы ты ненароком или по незнанию не смог их инстанциировать - потому что это явно не то. чего ты хочешь добиться smile


Автор: batigoal 13.5.2005, 17:59
Мне кажется, что все немного проще - создать адаптер, и не переопределить ни одного метода - бессмысленно. Поэтому и объявили его abstract, хотя у него есть все, чтобы быть обычным классом.

То же самое, что сказал Stampede, только покороче smile

Автор: Stampede 13.5.2005, 19:04
Цитата(Lamer @ 13.5.2005, 17:59)
То же самое, что сказал Stampede, только покороче


Нет, не то же самое. Ты неправильно толкуешь значение слова адаптер. Ты думаешь, что адаптер - это и есть обработчик события. Нет, обработчик события в терминологии AWT (и не только) - это handler.

А адаптер - он именно адаптер: переходник, приспособа, согласователь. Как, например, DC блок питания или видеокассета-переходник, в которую можно засовывать маленькую кассету от камеры.

Метафора особенно заметная, и ты испытываешь благодарность за ее существование, когда в потоке кодирования объявляешь анонимный класс, и тебе достаточно переопределить один-два метода и все, ты уже идешь дальше.

Так штааа... smile

Автор: batigoal 13.5.2005, 21:04
Цитата(Stampede @ 13.5.2005, 20:04)
ы думаешь, что адаптер - это и есть обработчик события.

А разве нет? Мы же регистрируем его именно как класс-обработчик.

Автор: Domestic Cat 13.5.2005, 21:08
Цитата(Lamer @ 13.5.2005, 12:04)
А разве нет? Мы же регистрируем его именно как класс-обработчик.

Не его, а класс, который от него наследует.


Автор: batigoal 13.5.2005, 21:20
Ну да, просто лень было писать. smile

Автор: Stampede 13.5.2005, 21:24
Цитата(Lamer @ 13.5.2005, 21:04)
А разве нет? Мы же регистрируем его именно как класс-обработчик.


На уровне абстракций, каковыми являются высокоуровневые понятия Listener (интерфейс), Handler (наша конкретная реализация слушателя == обработчик) и Adapter (вспомогательный класс-посредник), в семантическом плане мы делаем следующее:

регистрируем наш Handler в качестве Listener'а некоего гуйного объекта, используя (исключительно удобства ради) переходник Adapter соответствующего типа.

Все, Lamer George, пожалуйста, больше с этим вопросом ко мне не лезь, а то я разочаруюсь в твоих перцептивных способностях. Шутка ли, три раза подряд объяснить одно и то же разными словами. А если хочешь плюс поставить, то так просто и скажи smile

Автор: Domestic Cat 13.5.2005, 21:27
Вообще по определению адаптер - это то, что преобразовывает интерфейс (класса или интерфейса). А какой он должен быть - абстрактный или конкретный - дело разработчика.

Автор: batigoal 13.5.2005, 21:29
Цитата(Stampede @ 13.5.2005, 22:24)
А если хочешь плюс поставить, то так просто и скажи

Не вопрос. По сумме нескольких постов заслужил. smile

Оффтоп: Понял я, что мы друг друга не поймем

Автор: Stampede 13.5.2005, 21:36
Цитата(Lamer @ 13.5.2005, 21:29)
Оффтоп: Понял я, что мы друг друга не поймем


Ты здравый чувак, я здравый чувак - поймем smile Только вот в чем мне тебя понимать? У тебя же по данному вопросу нет внятной позиции. Изложи свою точку зрения, а я покажу, в чем ты заблуждаешься.

Автор: batigoal 14.5.2005, 14:07
Вот в этой части:
Цитата(Stampede @ 13.5.2005, 20:04)
Ты неправильно толкуешь значение слова адаптер. Ты думаешь, что адаптер - это и есть обработчик события. Нет, обработчик события в терминологии AWT (и не только) - это handler.

Я думаю, что В ДАННОМ СЛУЧАЕ класс, расширяющий адаптер, как раз и является handler'ом.
Но я уже понял твою мысль, так что можешь дальше не разжевывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)