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

OOP - How to create an instance of one type called to another type in Reason

我有两个抽象产品类型:

type abstractProductA = {.
  methodA: string
};

type abstractProductB = {.
  methodB: int
};

用于创建以下产品 classes:

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

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

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

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

所以当我使用以下 class:

创建新的 concreteFactory 时
class concreteFactory1 = {
  pub createProductA => (new productA1);
  pub createProductB => (new productA1);
};

和构造函数:

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

编译器应该抱怨 createProductB 只接受一个整数,而不是一个字符串(目前它不接受)。

谢谢,欢迎提出任何建议。

似乎错误应该发生在createProductB returns productA1 而不是productB1。为了实现这一点,您需要为 abstractFactory 定义一个虚拟 class 而不仅仅是一个对象类型,然后让 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) 上产生以下错误:

This expression has type productB1 but an expression was expected of type abstractProductA The second object type has no method methodB

full example here