2013-03-03 4 views
0

scala를 처음 사용하고 일부 상속 문제가 발생했습니다 ... 내 NodeVisitor 클래스가 GreenBasket에서 "b1"과 "b2"를 구별하지 못하고 오류를 제공합니다 바구니에 "방문"하는 방법이 없다고 말했습니다. GreenBasket은 "b1"및 "b2"가있는 GreenBasket 또는 OrangeBasket 객체를 보유 할 수 있어야합니다. "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 
} 

답변

0

올바르게 이해하면 방법을 다르게 호출해야합니다. 어때요?

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

accept 메소드의 서명을 변경해야합니다.

+0

의견을 보내 주셔서 감사합니다. 나는 지금 일하고있어. – rstojano

관련 문제