是否可以在扩展的 Scala class 中扩展方法?

Is it possible to extend a method within an extended scala class?

假设我有以下 scala 类,是否可以在 SecondClass 上扩展一个函数并向其添加更多代码? (可能链接到我想扩展的函数中的另一个函数)

package io.gatling.http.check
class FirstClass {

  def login() = {
    exec(http("Login")
      .post("anonymous/login")
      .body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
}
}

我想用以下内容扩展登录功能 (.check(status is 200)

class SecondClass extends FirstClass {

  def login() = {
     .check(status is 200))
}
}

这可能吗?

您要找的语法是

class X {
  def go(a: Int) = ???
}

class Y extends X {
  override def go(a: Int) = {
    val u = super.go(a)
    // do things with `u` and return whatever
  }
}

您需要进行一些重构才能使您的代码成为这种形式。我设想

class FirstClass {
  def body = ElFileBody("rest/UserAnonymousLogin.json")
  // stuff that calls `body`
}

class SecondClass {
  override def body = super.body.check(status is 200)
  // no need to redefine stuff as it's inherited from `FirstClass`
}

给定checks方法接受的可变数量HttpCheck,即HttpCheck*

def check(checks: HttpCheck*): HttpRequestBuilder

考虑将 FirstClass 重构为

  class FirstClass {
    def login(checks: HttpCheck*) = {
      exec(http("Login")
        .post("anonymous/login")
        .body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
        .check(checks: _*)
      )
    }
  }

请注意,默认情况下我们在调用 (new FirstClass).login().

时不通过任何检查

现在派生的 classes 可以像这样传递要执行的检查

  class SecondClass extends FirstClass {
    def loginWithStatusCheck() = {
      super.login(status is 200)
    }
  }

请注意,我们实际上并没有在这里覆盖 FirstClass.login

替代覆盖的另一种方法可能是函数组合,例如,我们将问题分解为更小的函数

  val buildClient: String => Http = http(_)
  val buildPostRequest: Http => HttpRequestBuilder = _.post("anonymous/login").body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
  val checkStatus: HttpRequestBuilder => HttpRequestBuilder = _.check(status is 200)

然后组合起来

exec((buildClient andThen buildPostRequest andThen checkStatus)("Login"))

现在我们可以简单地向组合添加更多步骤,而不用担心 class 层次结构和覆盖。