書くだけ問題。なぜ問題にしたんだろう
Backup2Counter = { get: Unit -> Nat, inc: Unit -> Unit, reset: Unit -> Unit, backup: Unit -> Unit, reset2: Unit -> Unit, backup2: Unit -> Unit, };
Backup2CounterRep = { x: Ref Nat, b: Ref Nat, b2: Ref Nat, };
buckup2CounterClass = \r: Backup2CounterRep. let super = backupCounterClass r in { get = super.get, inc = super.inc, reset = super.reset, backup = super.backup, reset2 = _:Unit. r.x := !(r.b2), backup2 = _:Unit. r.b2 := !(r.x), };
検査器が無いので保留。 書くだけっぽいが長そう……
- newでIDを生成して渡し、classではIDを受け取るようにする。sameObjectの判定ではそのIDを利用する。Repに記録する必要はない。 親クラスで実装されている場合、子クラスでは渡すだけ。
e.g.)
setCounterClass =
\r: SetCounterRep. \self: Source SetCounter. \id: Num
{ ...
sameObject = \obj:setCounterClass. obj.id == id
}
pros
- IDが衝突しない
cons
- newする側でIDを管理しないといけない
- class側でIDを生成する。コンストラクタで処理する感じ。
e.g.)
setCounterClass =
\r: SetCounterRep. \self: Source SetCounter.
let id = (何かしらのID生成) in {
...
sameObject = \obj:setCounterClass. obj.id == id
}
pros
- 簡単 cons
- ID生成方法によっては衝突する(他のIDの状態が分からない)
- RepにID要素を追加しそこに放り込む。こちらもコンストラクタで処理する感じ
e.g.)
SetCounterRep = { ... id: Num }
setCounterClass =
\r: SetCounterRep. \self: Source SetCounter.
r.id = (何かしらのID生成) ;
{
...
sameObject = \obj:setCounterClass. obj.id == r.id
}
pros
- cloneが簡単 cons
- こちらも衝突しうる