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中的代码不是以其设计的方式将只会让它变得很难。
我不确定您是否意味着您的代码是有效的解决方案。在我的情况下,编译器要求为导致我的错误方法的变量的覆盖修饰符... – Rodrigo
@Javier我已更新代码。我想我添加了足够的元素来理解发生了什么。随意问你是否不明白任何事情。 – Sisso