Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:当其他类已经扩展基类时,如何扩展基类?_Java_Oop - Fatal编程技术网

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

Java:当其他类已经扩展基类时,如何扩展基类?,java,oop,Java,Oop,我想在ApacheCommonsEmail中扩展一个基类,基类是email。我只是想给.send()方法添加一些限制 其他3个类扩展电子邮件:HtmlEmail、SimpleMail和MultipartMail 没有用于创建这3个派生类的工厂方法 有没有最好的方法可以从基本的Email类扩展这个方法?我所能想到的就是扩展3个派生类,在每个派生类中重写.send(),并让它们调用一个通用的静态方法来完成.send()节流功能。看起来您可以使用和编写,例如节流邮件。它只是装饰另一个电子邮件实例(它可

我想在ApacheCommonsEmail中扩展一个基类,基类是email。我只是想给.send()方法添加一些限制

其他3个类扩展电子邮件:HtmlEmail、SimpleMail和MultipartMail

没有用于创建这3个派生类的工厂方法


有没有最好的方法可以从基本的Email类扩展这个方法?我所能想到的就是扩展3个派生类,在每个派生类中重写.send(),并让它们调用一个通用的静态方法来完成.send()节流功能。

看起来您可以使用和编写,例如
节流邮件。它只是装饰另一个
电子邮件
实例(它可以是任何
电子邮件
子类),并且它可以
@覆盖
发送
方法以强制执行一些限制。所有其他方法都被简单地委托给底层的
Email
实例

例如,这与a的工作原理类似。它可以修饰任何
读卡器
,为其提供缓冲功能。其他示例包括提供实用方法的,例如包装任何
集合
,并用同步功能装饰它

除非清楚地记录了基类以便于子类重写某些方法,否则您通常应该支持组合(has-a)而不是继承(is-a)关系

另见
  • 有效Java第二版,第16项:偏爱组合而非继承
  • 有效Java第二版,第17项:继承的设计和文档,否则禁止
相关问题

这太棒了,我已经阅读了许多关于这种模式的教程。但我并没有完全掌握它:如果我需要一个HtmlEmail(它扩展了电子邮件),我所需要的只是为Email.send()添加功能,那么我是否也需要一个HtmlEmail的具体装饰器(反过来,对于电子邮件的所有其他子类,SimpleMail和MultiPartEmail,实现所有相应的方法以转发到具体对象)?@David:每种装饰都有混凝土装饰师。因此,您可能有一个
throttleedemail
,它限制任何
电子邮件的发送,并且您以后可能会对
电子邮件的其他方面进行进一步的修饰(例如
AutosignedEmail
或其他任何内容),您可以将它们堆叠在一起。无论您是在装饰
HtmlEmail
还是在装饰
SimpleEmail
,这其实并不重要。