0

我有两种抽象产品类型:

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

这样当我使用以下类创建新的具体工厂时:

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

和构造函数:

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

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

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

4

1 回答 1

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

在此处查看完整示例

于 2017-10-04T14:13:16.587 回答