如何在Reason中为方法分配参数

时间:2017-09-20 12:33:25

标签: ocaml reason

我有以下abstractFactory类:

class virtual virtualProductA = {
  pub virtual methodA: string;
};

class virtual virtualProductB = {
  pub virtual methodB: int;
};

class virtual abstractFactory = {
  pub virtual createProductA : virtualProductA;
  pub virtual createProductB : virtualProductB;
};

特别是,我想指定abstractFactory createProductA方法有一个可选的param,可以是任何类型。

以下内容: pub virtual createProductA (param?:any) : virtualProductA;

但是,上述内容编译不正确。

对于正确语法的任何建议都非常感激。谢谢。

1 个答案:

答案 0 :(得分:3)

  

免责声明:我正在使用OCaml。 Reason原因示例使用Try Reason翻译。

我不确定我的问题是否正确,但这是我对此的看法。

如果您想为类virtualProductA的构造函数提供参数,请在此处使用语法。

OCaml的

class virtual virtualProductA my_object = object
  val value : 'a = my_object
  method virtual  methodA : string
end

原因

class virtual virtualProductA my_object => {
  as _;
  val value: 'a = my_object;
  pub virtual methodA: string;
};

在抽象工厂中,方法createProductA现在采用参数并且是多态的。

OCaml的

class virtual abstractFactory = object
  method virtual createProductA : 'a. 'a -> virtualProductA
  method virtual createProductB : virtualProductB
end

原因

class virtual abstractFactory = {
  as _;
  pub virtual createProductA: 'a. 'a => virtualProductA;
  pub virtual createProductB: virtualProductB;
};

类型量词'a.表示“适用于所有类型'a,...”。它用于告诉编译器“这不是一个类型参数,这只是一个多态方法”。

第二个想法,你可能想要virtualProductA泛型,这里的语法是:

OCaml的

class virtual ['a] virtualProductA my_object = object
  val value : 'a = my_object
  method value = value (* type 'a is inferred here, no need to over-annotate *)
  method virtual methodA : string
end

原因

class virtual virtualProductA 'a my_object => {
  as _;
  val value: 'a = my_object;
  pub value = value;  /* type 'a is inferred here, no need to over-annotate */
  pub virtual methodA: string;
};