Java:当其他类已经扩展基类时,如何扩展基类?

时间:2010-08-23 19:31:47

标签: java oop

我想在apache commons电子邮件中扩展基类,基类是Email。我只是想为.send()方法添加一些限制

其他3个类扩展了Email:HtmlEmail,SimpleEmail和MultiPartEmail

没有工厂方法可以创建这3个派生类。

我是否有最好的方法可以从基本的电子邮件类扩展这一方法?我能想到的是扩展3个派生类,在每个派生类中重写.send(),并让每个派生用一个公共静态方法来完成.send()限制功能。

1 个答案:

答案 0 :(得分:19)

看起来您可以使用decorator pattern并撰写例如一个ThrottledEmail。它只是装饰Email的另一个实例(它可以是 ANY Email子类),它可以@Override send方法来强制执行某些限制。所有其他方法都只是委托给基础Email实例。

这类似于java.io.BufferedReader的工作方式。它可以装饰任何Reader以赋予其缓冲功能。其他示例包括java.util.Collections,它提供实用程序方法,例如Collection<T> synchronizedCollection(Collection<T>),它包装 ANY Collection<T>并使用同步功能对其进行修饰。

除非明确记录基类以便于@Override某些方法的子类,否则通常应该优先考虑组合( has-a )而不是继承( is-a )关系。

另见

  • Effective Java 2nd Edition,Item 16:赞成组合而不是继承
  • Effective Java 2nd Edition,Item 17:继承的设计和文档,否则禁止它

相关问题