2017-01-04 4 views
0

コンパイラプロジェクト用にクラス階層をスケーラで設計する際に問題があります。次のように階層構造が見えます:ここでScalaのクラス階層の設計。コンストラクタパラメータvsメンバー

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 

だから基本的に私は、異なる命令の2つの指標の平等を比較しています。

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) 

でもっとScalaの道

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) 

これはScalaで物事を書く方法ではありません。多くのにおいは、抽象クラス、var、親フィールドです。コードはスケーラの設計方法ではなく、難しくなります。

+0

あなたのコードが有効な解決策であることを意味するかどうかはわかりません。私の場合、コンパイラは間違ったアプローチにつながる変数のオーバーライド修飾子を要求します。 – Rodrigo

+0

@Javier私はコードを更新しました。私は何が起こるのかを理解するのに十分な要素を追加したと思う。あなたが何かを理解していないかどうか尋ねてください。 – Sisso

関連する問題