如何在不修改此特定类的情况下扩展具有功能的Scala类?

时间:2016-09-08 14:13:48

标签: scala playframework playframework-2.0

假设我想封装一个类的功能,这意味着我想在客户端和这个特定的类之间引入一个代理。例如,Play的Result类具有以下方法:

  /**
   * Adds headers to this result.
   *
   * For example:
   * {{{
   * Ok("Hello world").withHeaders(ETAG -> "0")
   * }}}
   *
   * @param headers the headers to add to this result.
   * @return the new result
   */
  def withHeaders(headers: (String, String)*): Result = {
    copy(header = header.copy(headers = header.headers ++ headers))
  }

我们假设我不想直接使用此方法,而是想使用代理。因此,我不想调用Redirect(controllers.app.routes.Application.index).withHeaders(<XYZ>)而是调用我自己的方法,后来调用.withHeaders(<XYZ>)

Redirect(controllers.app.routes.Application.index).customWithHeaders(<XYZ>)

如何实施?这可以通过实现一个将由控制器扩展的特性来完成吗?

1 个答案:

答案 0 :(得分:1)

import play.api.mvc.Result

implicit class ResultUtils (result: Result) {
    def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*)
}

在范围内使用ResultUtils,您现在可以执行Redirect(something).withCustomHeaders

套餐对象

package object common {
    implicit class ResultUtils (result: Result) {
      def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*)
    }
}

import common._ //import common and get this class in scope

<强>性状

trait Implicits {
  implicit class ResultUtils (result: Result) {
      def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*)
    }
}

class ApplicationController @Inject() () extends Controller extends Something with Implicits {
  def fooAction = Action { Ok("bar").withCustomHeaders("foo" -> "bar") }
}