0

私はscalaに不慣れで、いくつかの継承の問題があります...私のNodeVisitorクラスはGreenBasketの「b1」と「b2」を区別できず、Basketに「visit」メソッドがないことを示すエラーが表示されます。GreenBasketは、「b1」および「b2」を持つGreenBasketまたはOrangeBasketオブジェクトを保持できる必要があります。「b1」と「b2」のタイプに応じて、適切な「visit」メソッドを呼び出すにはどうすればよいですか?ありがとうございました。

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
}
4

1 に答える 1

0

私が正しく理解していれば、メソッドを別の方法で呼び出す必要があります。これはどう:

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

accept メソッドの署名を変更する必要があることに注意してください。

于 2013-03-03T22:37:54.767 に答える