是否可以在扩展的 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 层次结构和覆盖。
假设我有以下 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 层次结构和覆盖。