コンパイラプロジェクト用にクラス階層をスケーラで設計する際に問題があります。次のように階層構造が見えます:ここで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
を宣言するよりも何か良いことはありますか?
あなたのコードが有効な解決策であることを意味するかどうかはわかりません。私の場合、コンパイラは間違ったアプローチにつながる変数のオーバーライド修飾子を要求します。 – Rodrigo
@Javier私はコードを更新しました。私は何が起こるのかを理解するのに十分な要素を追加したと思う。あなたが何かを理解していないかどうか尋ねてください。 – Sisso