Java: Как расширить базовый класс, когда другие классы уже расширяют базовый?

Я хочу расширить базовый класс в электронной почте Apache Commons, базовый класс - Email. Я просто хочу добавить регулирование в метод .send ()

. 3 других класса расширяют Email: HtmlEmail, SimpleEmail и MultiPartEmail

. Не существует фабричного метода для создания этих 3 производных классов.

Существует ли лучший способ, которым я могу расширить этот один метод из базового класса электронной почты? Все, что я могу придумать, - это расширить 3 производных класса, переопределить .send () в каждом и заставить каждый из них вызывать общий статический метод для выполнения функции регулирования .send ().

8
задан skaffman 23 August 2010 в 19:33
поделиться

1 ответ

Похоже, вы можете использовать шаблон декоратора и написать, например, a ThrottledEmail . Он просто украшает другой экземпляр Email (это может быть подкласс ANY Email ) и может @Override метод send чтобы обеспечить некоторое дросселирование. Все остальные методы просто делегируются базовому экземпляру Email .

Это похоже на то, как работает, например, java.io.BufferedReader . Он может украсить любой Считыватель , чтобы придать ему функцию буферизации. Другие примеры включают java.util.Collections , который предоставляет служебные методы, такие как Collection synchronizedCollection (Collection ) , который обертывает ANY Collection и украшает его функциями синхронизации.

Если базовый класс четко не задокументирован для облегчения создания подклассов для @Override определенных методов, вам обычно следует отдавать предпочтение композиции ( has-a ), а не наследованию ( is-a ) отношения.

См. Также

  • Эффективное 2-е издание Java, Правило 16: Предпочтение композиции над наследованием
  • Эффективное 2-е издание Java, Правило 17: Дизайн и документирование для наследования, или же запретить его

Связанные вопросы

19
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: