代码之家  ›  专栏  ›  技术社区  ›  Mat Kelly

OCAML中的介质设计模式

  •  1
  • Mat Kelly  · 技术社区  · 17 年前

    我正试图在ocaml(la中介模式)中的两个类之间实现相互绑定,并在编译时出错。

    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]语法非常熟悉,但我已经求助于它(没有用),试图让中介保持对所有同事和每个同事对各自中介的引用,同时也试图克服类在源代码中定义的重要性。我该怎么做才能让同事和他们的调解人保持联系呢?

    1 回复  |  直到 17 年前
        1
  •  3
  •   newacct    17 年前

    我解决了所有的编译问题。从同事继承时,需要提供其类型参数。因此,我认为Concrete同事也需要一个类型参数。另外,忘记将构造函数参数min传递给继承的类。我使用对象的类型为mycalleague的类型保护添加了一个类型参数。

    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;;
    

    但是,我不熟悉中介模式,所以我不确定什么是实现中介模式的正确方法。你确定你需要对象、虚拟类和东西吗?