Scala的类层次结构的设计。构造函数参数与成员

问题描述:

我在为scala编译器项目设计类层次结构时遇到问题。层次结构如下所示:Scala的类层次结构的设计。构造函数参数与成员

abstract class TACInstr(index:Int) 

case class TAC_Label(label: String,index : Int) extends TACInstr(index) 
case class TAC_Jump(label: TAC_Label,index : Int) extends TACInstr(index) 
... 

这里index是表示在一些上市指令的顺序号的变量。至少对于TAC_Label子类,我不能将这个变量声明为不可变的,这一点很重要,因为它在我的代码中并不总是可预测的,因此声明时它的索引应该是什么。

后来,我在下面的定义使用该索引值:

def getBlock(i : TACInstr) : BasicBlock = 
blocks.find(b => b.instr.index == i.index).get 

所以基本上我比较不同指令中的两个指标的平等。这提供了以下错误:

Cannot resolve symbol index 

因为很显然这样的索引是私有的类定义

我接近

我想声明的层次结构如下:

abstract class TACInstr(var index:Int) 

case class TAC_Label(label: String,override var index : Int) extends TACInstr(index) 
case class TAC_Jump(label: TAC_Label,override var index : Int) extends TACInstr(index) 
... 

但我得到以下错误类型:

Error:... overriding variable index in class TACInstr of type Int; 
variable index cannot override a mutable variable 

是否有解决这个问题的任何优雅的解决方案?比声明index成员更好的东西?

主要问题是您试图重写字段。下面的例子解决的问题:

// index is public 
abstract class TACInstr(var index:Int) 

// label is public, i is private 
class TAC_Label(val label: String, i: Int) extends TACInstr(i) 
class TAC_Jump(val label: TAC_Label, i: Int) extends TACInstr(i) 

val l = new TAC_Label("l", 0) 
println(l.index) 
与性状

现在

trait TACInstr { var index:Int } 

case class TAC_Label(label: String, var index: Int) extends TACInstr 
case class TAC_Jump(label: TAC_Label, var index: Int) extends TACInstr 

val l = TAC_Label("l", 0) 
println(l.index) 

更多斯卡拉方式

trait TACInstr { val index:Int } 

// label is public, i is private 
case class TACLabel(label: String, val index: Int) extends TACInstr 
case class TACJump(label: TACLabel, val index: Int) extends TACInstr { 
    def withLabelIndex(newIndex: Int): TACJump = this.copy(label = label.copy(index = newIndex)) 
} 

val jump = TACJump(TACLabel("l", 1), 2) 
val changed = jump.withLabelIndex(3) 
println(changed) 

这不是在斯卡拉写事情的方式。许多气味是:抽象类,var,父字段。 scala中的代码不是以其设计的方式将只会让它变得很难。

+0

我不确定您是否意味着您的代码是有效的解决方案。在我的情况下,编译器要求为导致我的错误方法的变量的覆盖修饰符... – Rodrigo

+0

@Javier我已更新代码。我想我添加了足够的元素来理解发生了什么。随意问你是否不明白任何事情。 – Sisso