2017-01-04 72 views
0

我在爲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成員更好的東西?

回答

1

主要問題是您試圖重寫字段。下面的例子解決的問題:

// 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