根据我在X中传递的对象类型,我需要使用apply方法。我可以指定我想要使用的修饰符(Y或Z)。我需要有一个使用'跟随'函数的语法,如下所示:
(object of type B) following Y
或
(object of type C) following Z
代码如下所示:
trait A
{
def following(modifier: X) = modifier(this)
}
case class B() extends A{}
case class C() extends A{}
trait X {}
object Y extends X
{
apply(obj: B):B = {}
apply(obj: C):C = {}
}
object Z extends X
{
apply(obj: B):B = {}
apply(obj: C):C = {}
}
编译器在我实现'follow'函数的行中给出了错误。我做错了什么?
答案 0 :(得分:3)
我猜你想要的是这样的:
trait X {
def apply[T](obj: T): T
}
trait A {
def following(modifier: X) = modifier(this)
}
case class B() extends A
case class C() extends A
object Y extends X {
override def apply[B](obj: B): B = { obj }
override def apply[C](obj: C): C = { obj }
}
object Z extends X {
override def apply[B](obj: B): B = { obj }
override def apply[C](obj: C): C = { obj }
}
运气不好我认为你不能有两个重写的申请方法,因为它不会编译。如果这是可能的,那么我也很乐意知道。你现在可以做的是使用一种模式匹配的apply方法:
trait X {
def apply[T](obj: T): T
}
trait A {
def following(modifier: X) = modifier(this)
}
case class B() extends A
case class C() extends A
object Y extends X {
override def apply[T](obj: T): T = {
obj match {
case o: B => obj
case o: C => obj
}
}
}
object Z extends X {
override def apply[T](obj: T): T = {
obj match {
case o: B => obj
case o: C => obj
}
}
}
您也可以通过其他方式获得完全相同的效果(包括语法)。 在我看来,更清洁,更容易理解:
sealed trait X
case class Y() extends X
case class Z() extends X
trait A[T] {
def following(modifier: X): T
}
case class B() extends A[B] {
override def following(modifier: X) = modifier match {
case o: Y => this
case o: Z => this
}
}
case class C() extends A[C] {
override def following(modifier: X) = modifier match {
case o: Y => this
case o: Z => this
}
}
答案 1 :(得分:1)
你做错了几件事:
apply
定义需要def
。apply
个方法,但只作为抽象方法。following
需要在B和C中重写,以便编译器知道要在X中调用哪个重载方法。following
需要在A中抽象。您正在实施访客模式。我建议找一份the gang of four book,并从那里的例子开始。