OOP - 如何在Reason中创建一个被调用到另一个类型的实例

时间:2017-10-03 03:06:36

标签: oop ocaml reason

我有两种抽象产品类型:

type abstractProductA = {.
  methodA: string
};

type abstractProductB = {.
  methodB: int
};

用于创建以下产品类:

class productA1 = {
  pub methodA => "This is methodA of ProductA1";
};

class productB1 = {
  pub methodB => 1;
};

我想在抽象工厂中调用abstractProductA的实例以及abstractProductB。类似下面的内容(语法关闭,我知道):

type abstractFactory = {.
  createProductA: abstractProductA,
  createProductB: abstractProductB
};

因此,当我使用以下类创建新的concreteFactory时:

class concreteFactory1 = {
  pub createProductA => (new productA1);
  pub createProductB => (new productA1);
};

和constructer:

let g = new concreteFactory1#createProductB;
Js.log (g#methodA);

编译器应该抱怨createProductB只接受一个int,而不是一个字符串(它当前没有)。

谢谢,任何建议都非常欢迎。

1 个答案:

答案 0 :(得分:1)

似乎错误应该发生在createProductB返回productA1而非productB1的位置。为了实现这一点,您需要为abstractFactory定义一个虚拟类,而不仅仅是一个对象类型,然后让concreteFactory显式继承它。

class virtual abstractFactory = {
  pub virtual createProductA: abstractProductA;
  pub virtual createProductB: abstractProductB;
};

class concreteFactory1 = {
  inherit abstractFactory;
  pub createProductA => (new productB1);
  pub createProductB => (new productB1);
};

这会在pub createProductA => (new productB1)上产生以下错误:

  

此表达式的类型为productB1,但表达式的类型为abstractProductA,第二个对象类型没有方法methodB

请参阅full example here