Как правило, мы используем концепцию интерфейса для реализации RMI также в прослушивании событий, мы используем интерфейсы. Почему мы не используем абстрактные классы в обоих случаях.RMI/слушатели событий с абстрактным классом?
ответ
Для событий: поскольку нормальная ситуация заключается в том, что у нас есть собственный класс реализации, и он вполне может прослушивать несколько разных событий; мы не можем расширять два разных абстрактных класса.
Скаффман уже объяснил одну проблему с использованием абстрактных классов для RMI. Я бы сделал еще один шаг, абстрактный класс - это совершенно неверное понятие для этой цели. Поставщик услуг должен предоставить своим клиентам информацию о том, как вызвать услугу. Интерфейс - это именно то, что нам нужно для этого - он сообщает клиенту , что можно сделать, и ничего о , как все сделано. Когда мы приводим абстрактный класс, мы включаем (частичную) информацию о реализации. Клиенту не нужно это видеть, и в RMI-конфликте возможно даже не скомпилировать его - абстрактный класс на сервере может ссылаться на классы, которые клиент даже не имеет. Конечно, вы можете обрезать все вещи, которые не нужны клиенту, вся реализация и т. Д., И вот! Вы вернулись с информацией, необходимой в интерфейсе.
Так моя практика:
Определите свои интерфейсы, мой контракт с внешним миром.
Если у меня может быть несколько реализаций этого Интерфейса, и особенно если я хочу помочь разработчику, определите абстрактный класс, который реализует интерфейс. Включить общий код реализации в этом абстрактном классе, и оставить некоторые методы абстрактных для реализаторов на самом деле заполнить
Или поставить его просто:. Интерфейс для клиентов, абстрактные классы для реализаторов, и вы можете хорошо выбрать использовать оба. И да, это подразумевает некоторое дублирование, и именно поэтому у нас есть хорошие IDE.
Поскольку RMI должен генерировать классы заглушки и скелета во время выполнения, которые реализуют эти интерфейсы, используя логику генерации прокси-сервера JRE. Это не работает с абстрактными классами, поэтому все операции RMI должны быть определены как интерфейсы.
Опоры только. Скелеты 12 лет устарели. – EJP
- 1. Сортировка с абстрактным классом
- 2. Работа с абстрактным классом
- 3. Интерфейс с абстрактным классом
- 4. MapStruct: проблема с абстрактным классом
- 5. @classmethod с абстрактным базовым классом
- 6. C++ Композиция с абстрактным классом
- 7. Наследования с абстрактным шаблонным классом
- 8. множественного наследования с абстрактным классом
- 9. WCF Сериализация с абстрактным классом
- 10. Сортировка списков с абстрактным классом
- 11. Как выводить с абстрактным классом
- 12. PHPUnit с абстрактным классом с использованием признака
- 13. с использованием l-значения с абстрактным классом
- 14. Почему ClassLoader является абстрактным классом?
- 15. Почему ValueType является абстрактным классом
- 16. проблемы с инъекционным абстрактным классом весной
- 17. C# XML Сериализация с абстрактным классом
- 18. java.lang.InstantiationException с абстрактным классом Использование Conponent-Scan
- 19. полиморфизма с абстрактным классом на соиЬ
- 20. C++ Перегрузки вход с абстрактным классом
- 21. Spring @ReponseBody @RequestBody с абстрактным классом
- 22. реализация ООП интерфейса наряду с абстрактным классом
- 23. Виртуальное наследование с абстрактным средним классом
- 24. создание конструктора копирования с абстрактным классом
- 25. Дженерики в Java с абстрактным классом
- 26. Высыхание код с абстрактным классом в C#
- 27. Ссылочная целостность на NHibernate с абстрактным классом
- 28. Наследование с отображением NHibernate и абстрактным классом
- 29. JPA: Запрос отношения OneToOne с абстрактным классом
- 30. Сопряжение с абстрактным классом Different производного класса
.. Что насчет RMI? – JavaUser
@JavaUser - расширен, чтобы покрыть это. Скажите, если вам это нравится. – djna