1

OCaml (メディエーター パターン) で 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] 構文に精通しているとは言えませんが、メディエーターがすべての同僚と各同僚への参照を保持できるようにするために、(無駄に) それに頼ってきました。ソースコードでのクラスの定義の重要性を克服しようとしながら、それぞれのメディエーター。同僚がメディエーターへの参照を保持できるようにするにはどうすればよいですか?

4

1 に答える 1

3

すべてのコンパイルの問題を修正しました。同僚から継承する場合は、そのタイプパラメータを指定する必要があります。結果として、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パターンを実装する適切な方法がわかりません。オブジェクトや仮想クラスなどが必要ですか?

于 2009-05-03T02:14:59.617 に答える