OCamlのMediatorデザインパターン
-
03-07-2019 - |
質問
OCaml(Mediatorパターンのような)の2つのクラス間の相互バインディングを達成しようとしていますが、コンパイル時にエラーが発生します。
class virtual ['mediator] colleague mIn = object
val m = mIn
method virtual getmediator : 'mediator
end;;
class concreteColleague mIn = object inherit colleague
method getmediator = m
end;;
(* Some other classes here *)
class mediator = object (self)
val mutable myColleague = (None:colleague option)
initializer
myColleague <- Some (new concreteColleague self)
end;;
エラー:クラスコンストラクターの同僚は1つの型引数を想定していますが、ここでは0型の引数に適用されます。
クラス定義の['foo]構文にそれほど精通しているとは言えませんが、調停者がすべての同僚への参照を保持できるようにするために(役に立たずに)頼りにしています各同僚をそれぞれのメディエーターに任せると同時に、ソースコードでのクラスの定義の重要性を克服しようとしています。同僚がメディエーターへの参照を保持できるようにするにはどうすればよいですか?
解決
すべてのコンパイルの問題を修正しました。同僚から継承した場合、そのtypeパラメーターを提供する必要があります。その結果、concreteColleagueには型パラメーターも必要だと思います。また、コンストラクター引数mInを継承クラスに渡すのを忘れていました。そして、オブジェクトのタイプを使用して、myColleagueのタイプガードにタイプパラメーターを追加しました。
class virtual ['mediator] colleague mIn = object
val m = mIn
method virtual getmediator : 'mediator
end;;
class ['mediator] concreteColleague mIn =
object inherit ['mediator] colleague mIn
method getmediator = m
end;;
(* Some other classes here *)
class mediator = object (self : 'self)
val mutable myColleague = (None:'self colleague option)
initializer
myColleague <- Some (new concreteColleague self)
end;;
ただし、Mediatorパターンに精通していないため、Mediatorパターンを実装する適切な方法は何かわかりません。オブジェクトと仮想クラスなどが必要ですか?
所属していません StackOverflow