在Play框架中的Action.scala中,它具有以下代码,为什么它定义了特征" Handler"没有任何方法或领域,定义空特征的目的或好处是什么?
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
}
答案 0 :(得分:6)
构建于@ 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
我们只使用空特征作为Number
和Plus
的常见超类型(连接),使我们能够对evaluate
进行模式匹配并使用Plus
在Plus
内。
我希望这不会太混乱。