質問

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パターンを実装する適切な方法は何かわかりません。オブジェクトと仮想クラスなどが必要ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top