在play框架的Action.scala中,它有如下代码,为什么它定义了一个没有任何方法或字段的特征“处理程序”,定义一个空特征的目的或好处是什么?
trait Handler
/**
* A handler that is able to tag requests. Usually mixed in to other handlers.
*/
trait RequestTaggingHandler extends Handler {
def tagRequest(request: RequestHeader): RequestHeader
}
最佳答案
基于@user2864740
一个简单的例子。 (这只是一个用例)
让我们为简单的表达式定义一个数据结构。我们希望数字的存在和结合表达式的加号。
trait Expression
case class Number(i: Int) extends Expression
case class Plus(e1: Expression, e2: Expression) extends Expression
现在为了评估 Expression
,我们定义一个这样的方法。
def evaluate(e: Expression): Int = e match {
case Number(i) => i
case Plus(e1, e2) => evaluate(e1) + evaluate(e2)
}
因为我们有 Expression
作为 Plus
的参数, 我们可以把 Plus
或 Number
在里面。
val myExpression = Plus(Plus(Number(1),Number(2)), Number(4))
evaluate(myExpression) //yields 7
我们只是将空 trait 用作 Number
的常见父类(super class)型(连接)。和 Plus
,使我们能够对 evaluate
进行模式匹配并使用 Plus
里面 Plus
.
我希望这不会太困惑。
关于scala - scala中空特征的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216788/