Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: GUI и Java FX приложения > Почему FocusAdapter абстрактный класс? |
Автор: Royan 13.5.2005, 17:31 | ||
Я не могу понять, что с ним не так, что он стал абстрактным:
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'а весь этот мартышкин труд за тебя уже проделали - написали абстрактные классы, состоящие из пустых определений методов, и назвали их адаптерами. Так что тебе только остается унаследовать от нужного тебе адаптера и переопределить интересующий тебя метод. А аббстрактными они объявлены для того, чтобы ты ненароком или по незнанию не смог их инстанциировать - потому что это явно не то. чего ты хочешь добиться ![]() |
Автор: batigoal 13.5.2005, 17:59 |
Мне кажется, что все немного проще - создать адаптер, и не переопределить ни одного метода - бессмысленно. Поэтому и объявили его abstract, хотя у него есть все, чтобы быть обычным классом. То же самое, что сказал Stampede, только покороче ![]() |
Автор: Stampede 13.5.2005, 19:04 | ||
Нет, не то же самое. Ты неправильно толкуешь значение слова адаптер. Ты думаешь, что адаптер - это и есть обработчик события. Нет, обработчик события в терминологии AWT (и не только) - это handler. А адаптер - он именно адаптер: переходник, приспособа, согласователь. Как, например, DC блок питания или видеокассета-переходник, в которую можно засовывать маленькую кассету от камеры. Метафора особенно заметная, и ты испытываешь благодарность за ее существование, когда в потоке кодирования объявляешь анонимный класс, и тебе достаточно переопределить один-два метода и все, ты уже идешь дальше. Так штааа... ![]() |
Автор: batigoal 13.5.2005, 21:04 | ||
А разве нет? Мы же регистрируем его именно как класс-обработчик. |
Автор: Domestic Cat 13.5.2005, 21:08 | ||
Не его, а класс, который от него наследует. |
Автор: batigoal 13.5.2005, 21:20 |
Ну да, просто лень было писать. ![]() |
Автор: Stampede 13.5.2005, 21:24 | ||
На уровне абстракций, каковыми являются высокоуровневые понятия Listener (интерфейс), Handler (наша конкретная реализация слушателя == обработчик) и Adapter (вспомогательный класс-посредник), в семантическом плане мы делаем следующее: регистрируем наш Handler в качестве Listener'а некоего гуйного объекта, используя (исключительно удобства ради) переходник Adapter соответствующего типа. Все, Lamer George, пожалуйста, больше с этим вопросом ко мне не лезь, а то я разочаруюсь в твоих перцептивных способностях. Шутка ли, три раза подряд объяснить одно и то же разными словами. А если хочешь плюс поставить, то так просто и скажи ![]() |
Автор: Domestic Cat 13.5.2005, 21:27 |
Вообще по определению адаптер - это то, что преобразовывает интерфейс (класса или интерфейса). А какой он должен быть - абстрактный или конкретный - дело разработчика. |
Автор: batigoal 13.5.2005, 21:29 | ||
Не вопрос. По сумме нескольких постов заслужил. ![]() Оффтоп: Понял я, что мы друг друга не поймем |
Автор: Stampede 13.5.2005, 21:36 | ||
Ты здравый чувак, я здравый чувак - поймем ![]() |
Автор: batigoal 14.5.2005, 14:07 | ||
Вот в этой части:
Я думаю, что В ДАННОМ СЛУЧАЕ класс, расширяющий адаптер, как раз и является handler'ом. Но я уже понял твою мысль, так что можешь дальше не разжевывать. |