代码之家  ›  专栏  ›  技术社区  ›  David Parks

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

  •  8
  • David Parks  · 技术社区  · 14 年前

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

    其他3类扩展电子邮件:htmlemail、simpleemail和multipartemail

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

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

    1 回复  |  直到 14 年前
        1
  •  19
  •   Community agent420    7 年前

    看起来你可以用 decorator pattern 写下例如 ThrottledEmail . 它只是装饰了 Email (可以) 任何 电子邮件 子类),它可以 @Override 这个 send 方法强制某些限制。所有其他方法都简单地委托给底层 电子邮件 实例。

    这类似于 java.io.BufferedReader 例如,工作。它可以装饰任何 Reader 给它一个缓冲特性。其他例子包括 java.util.Collections 提供实用方法,如 Collection<T> synchronizedCollection(Collection<T>) 哪些包装 任何 Collection<T> 并用同步特性来装饰它。

    除非基类有明确的文档记录以便于子类 @重写 某些方法,你一般应该喜欢构图( HAS-A )过度继承( IS-A )关系。

    也见

    • 有效Java第二版,第16项:继承优于继承
    • 有效的Java第二版,项目17:设计和文档继承,否则禁止

    相关问题