Есть ли возможность параметризации с использованием абстрактных классов, а не интерфейсов?

В настоящее время я разрабатываю API на основе компонентов, который сильно зависит от состояния. Компоненты верхнего уровня реализуют около дюжины интерфейсов каждый.

Таким образом, стандартные компоненты верхнего уровня находятся поверх стека абстрактных реализаций, которые, в свою очередь, содержат несколько реализаций миксинов и реализуют несколько интерфейсов миксинов.

Пока все хорошо (надеюсь).

Проблема в том, что базовая функциональность чрезвычайно сложна для реализации (тысячи строк в 5 слоях базовых классов), и поэтому я не хочу, чтобы разработчики компонентов сами реализовывали интерфейсы, а скорее расширяли мои базовые классы (где все котельные код таблички уже написан).

Поэтому, если API принимает интерфейсы, а не ссылки на абстрактную реализацию, которую я хочу, чтобы разработчики компонентов расширяли, то у меня есть риск, что разработчик не выполнит проверку, которая требуется и предполагается другими областями кода.

Поэтому мой вопрос: допустимо ли иногда параметризовать методы API, используя ссылку на абстрактную реализацию, а не ссылку на интерфейс (ы), который он реализует?

У вас есть пример хорошо разработанного API, использующего эту технику, или я пытаюсь уговорить себя на плохую практику?


person Chris    schedule 09.05.2010    source источник
comment
на всякий случай - о каком языке идет речь?   -  person Bozho    schedule 10.05.2010


Ответы (1)


Пока все хорошо (надеюсь).

Не совсем. Реализация дюжины интерфейсов — плохой знак. Но я не могу сказать, как реструктурировать, или возможно ли это, так как я не знаю кода.

Поэтому мой вопрос: допустимо ли иногда параметризовать методы API, используя ссылку на абстрактную реализацию, а не ссылку на интерфейс (ы), который он реализует?

Редко, да. Например (Ява):

  • JSF: javax.faces.context.FacesContext является абстрактным, но передается как параметр.
  • ЭЛ: javax.el.ELContext - то же самое.
  • АВТ: java.awt.Image - то же самое.

Но в любом случае, я бы сказал нет. Нехорошо ограничивать разработчиков реализациями. Они могут захотеть предоставить макет, который не должен выполнять ни одну из упомянутых проверок или использовать динамические прокси.

Наконец, если вы абсолютно уверены, что не сможете реструктурировать свои интерфейсы, вы можете использовать как можно меньше параметров абстрактного класса.

person Bozho    schedule 09.05.2010
comment
Как вы думаете, как динамические прокси помогут в этом конкретном случае использования? - person Chris; 11.05.2010
comment
Я не вижу, как. Но мне не хватает всей картины. - person Bozho; 11.05.2010