2009-05-02 10 views
1

OCaml(メディエーターパターン)の2つのクラス間の相互バインドを達成しようとしており、コンパイル時にエラーが発生しています。OCamlのメディエーターデザインパターン

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]構文に精通しているとは言えませんが、メディエータがすべての同僚への参照を保持できるようにしようとすると各同僚をそれぞれのメディエータに任命しながら、ソースコードにおけるクラスの定義の重要性を克服しようとしています。どのようにして同僚にメディエーターの参照を残すことができますか?

答えて

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

+0

ありがとうございます。あなたの説明はとても役に立ちました。 –