Java: How to extend a base class when other classes already extend the base?
I want to extend a base clas开发者_StackOverflow社区s in apache commons email, the base class is Email. I simply want to add some throttling to the .send() method
3 other classes extend Email: HtmlEmail, SimpleEmail, and MultiPartEmail
There is no factory method for creating these 3 derived classes.
Is there a best way that I can extend this one method from the base Email class? All I can think of is to extend the 3 derived classes, override .send() in each, and have each of them call a common static method to accomplish the .send() throttling functionality.
It looks like you can use the decorator pattern and write e.g. a ThrottledEmail
. It simply decorates another instance of Email
(it can be ANY Email
subclass) and it can @Override
the send
method to enforce some throttling. All other methods are simply delegated to the underlying Email
instance.
This is similar to how a java.io.BufferedReader
works, for example. It can decorate any Reader
to give it a buffering feature. Other examples include java.util.Collections
that provides utility methods such as Collection<T> synchronizedCollection(Collection<T>)
which wraps ANY Collection<T>
and decorates it with synchronization features.
Unless the base class is clearly documented to facilitate subclasses to @Override
certain methods, you should generally favor composition (has-a) over inheritance (is-a) relationship.
See also
- Effective Java 2nd Edition, Item 16: Favor composition over inheritance
- Effective Java 2nd Edition, Item 17: Design and document for inheritance, or else prohibit it
Related questions
- when do we need Decorator Pattern?
- Prefer composition over inheritance?
- Examples of GoF Design Patterns
- Guava
ForwardingList
usage example
精彩评论