Oop Scala:从抽象父类参数派生正确的子类

Oop Scala:从抽象父类参数派生正确的子类,oop,scala,inheritance,Oop,Scala,Inheritance,我是scala新手,有一些继承问题。。。 我的NodeVisitor类无法区分绿篮中的“b1”和“b2”,并提供了一个错误,指出绿篮中没有方法“visit”。 绿筐必须能够容纳“b1”和“b2”的绿筐或橘子盘对象。 如何根据“b1”和“b2”的类型调用适当的“访问”方法? 多谢各位 trait Visitor{ def visit(o: OrangeBasket): Int def visit(g: GreenBasket): Int } sealed abstract class B

我是scala新手,有一些继承问题。。。 我的NodeVisitor类无法区分绿篮中的“b1”和“b2”,并提供了一个错误,指出绿篮中没有方法“visit”。 绿筐必须能够容纳“b1”和“b2”的绿筐或橘子盘对象。 如何根据“b1”和“b2”的类型调用适当的“访问”方法? 多谢各位

trait Visitor{
  def visit(o: OrangeBasket): Int
  def visit(g: GreenBasket): Int
}

sealed abstract class Basket() {
  def accept(visitor: Visitor): Unit
}

case class OrangeBasket(count: Int, kilos: Double) extends Basket(){
  def this(count: Int) = this(count, 0)
  def accept(visitor: Visitor) = visitor.visit(this)
}

case class GreenBasket(b1: Basket, b2: Basket) extends Basket(){
  def this(b1: Basket) = this(b1, null)
  def this() = this(null)
  def accept(visitor: Visitor) = visitor.visit(this)
}

class NodeVisitor() extends Visitor{
  def visit(o: OrangeBasket) = 1
  def visit(g: GreenBasket) = this.visit(g.b1) + this.visit(g.b2) + 1
}

如果我理解正确,您应该以不同的方式调用这些方法。这个怎么样:

class NodeVisitor() extends Visitor{
  def visit(o: OrangeBasket) = 1
  def visit(g: GreenBasket) = g.b1.accept(this) + g.b2.accept(this) + 1
}
请注意,您应该更改accept方法签名