【问题标题】:Java: How to extend a base class when other classes already extend the base?Java:当其他类已经扩展了基类时,如何扩展基类?
【发布时间】:2010-08-23 19:31:47
【问题描述】:

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

其他 3 个类扩展了电子邮件:HtmlEmail、SimpleEmail 和 MultiPartEmail

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

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

【问题讨论】:

    标签: java oop


    【解决方案1】:

    看起来您可以使用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 第 2 版,第 16 条:优先组合优于继承
    • Effective Java 2nd Edition,Item 17: Design and document for inheritance,或者禁止它

    相关问题

    【讨论】:

    • 这很棒,我已经阅读了很多关于这种模式的教程。但我并没有完全掌握它:如果我需要一个 HtmlEmail(它扩展了 Email),而我所需要的只是向 Email.send() 添加功能,我是否还需要一个用于 HtmlEmail 的 ConcreteDecorator(反过来对所有电子邮件的其他子类 - SimpleEmail 和 MultiPartEmail,实现所有各自的方法以转发到具体对象)?
    • @David:每个装饰都有具体的装饰器。所以你可能有一个ThrottledEmail,它会限制任何Email的发送,你以后可能会在Email的其他方面有更多的装饰(例如AutosignedEmail或其他),你可以将它们堆叠在每个上面其他。装饰HtmlEmail 还是SimpleEmail 并不重要。
    猜你喜欢
    • 2019-05-22
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多