可以在扩展的scala类中扩展方法吗?

可以在扩展的scala类中扩展方法吗?,scala,gatling,Scala,Gatling,假设我有以下scala类,是否可以在SecondClass上扩展函数并向其添加更多代码?(可能链接到我要扩展的函数中的另一个函数) 我想用以下内容扩展登录功能(.check(状态为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 r

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

我想用以下内容扩展登录功能(.check(状态为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`
}
给定的方法接受一个数量可变的
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()时,默认情况下我们是如何不通过任何检查的

现在,派生类可以通过一个类似这样执行的检查

  class SecondClass extends FirstClass {
    def loginWithStatusCheck() = {
      super.login(status is 200)
    }
  }
请注意,我们实际上并没有覆盖第一类。请在此处登录

另一种代替重写的方法是函数合成,例如,我们将问题分解为更小的函数

  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"))

现在,我们可以简单地向组合中添加进一步的步骤,而不用担心类层次结构和重写。

这是可能的,但是这里的
状态是什么?它没有在代码中定义。check(状态为200)是一个应该在.body之后的链。因此,在我想要的登录扩展之后,它看起来像:exec(http(“login”)).post(“匿名/登录”).body(ElFileBody(“rest/UserAnonymousLogin.json”).check(状态为200))).asjson编译吗?我不知道在这两个示例中
status
是在哪里定义的。status是包io.gatling.http.check的一部分,如果您导入它,它会编译。在我的示例中,扩展的功能与此无关。我的问题是,允许这种类型的函数链扩展的语法是什么。当然,尽管它总是有帮助的当所有内容都定义好后,这里的人会回答问题,请看,这非常有帮助,非常感谢!您的回答也让我意识到我没有正确地问这个问题,因为我实际上是在尝试将方法链接到函数未返回的对象上,请允许我使用以下示例:
类测试{def login()={http(“Login”).post(“Login”).body(ElFileBody(“Login.json”)).asJson.check(状态为200)}def login2()={exec(http(“Login”).post(“Login”).body(ElFileBody(“Login.json”).asJson.check(状态为200))}类Test2扩展了测试{override def Login=super.Login.check()override def login2=super.login2.check}
堆栈溢出拒绝将我的答案显示为代码:(无论如何,示例login2不会编译,因为我实际上是在尝试在http上链接,而实际上是在exec上链接。我确实希望exec在原始方法上,但在需要时添加另一个验证,有什么办法吗?很好!非常感谢!我会使用
def login(检查:HttpCheck*)
超级登录(状态为200)
  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"))