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

Dav*_*rks 8 java oop

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

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

没有工厂方法来创建这3个派生类.

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

pol*_*nts 19

看起来你可以使用装饰器模式并编写例如a ThrottledEmail.它只是装饰的另一个实例Email(其可以是任何 Email亚类),它可以@Overridesend方法执行一些节流.所有其他方法都只是委托给底层Email实例.

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

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

也可以看看

  • 有效的Java第2版,第16项:支持组合而不是继承
  • 有效的Java第2版,第17项:继承的设计和文档,或者禁止它

相关问题

  • +1用于使用合成而不是继承. (5认同)