【发布时间】:2017-10-04 22:13:16
【问题描述】:
我有两种抽象产品类型:
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);
};
和构造函数:
let g = new concreteFactory1#createProductB;
Js.log (g#methodA);
编译器应该抱怨 createProductB 只接受一个 int,而不是一个字符串(它目前没有)。
谢谢,欢迎提出任何建议。
【问题讨论】:
-
我不明白你的问题。如果您有两个具有不同名称的方法,编译器将检查名称并在检查类型之前对其进行抱怨。如果没有,它将检查哪些类型?
-
对不起,我还是不明白。
abstractProductB没有methodA,所以在检查方法的类型之前它会抱怨,因为如果没有方法,也没有方法类型可以检查。但即使是这样,Js.log也可以接受任何内容(其类型为'a => unit。如果您希望编译器抱怨它不是字符串,则需要将其与仅限于字符串的内容一起使用。 -
好吧,你从
createProductA返回一个productB,它确实有一个methodB。如果你尝试#methodA,你会得到一个错误。 -
您似乎认为
concreteFactory1会自动符合abstractFactory,但您会更早收到错误。 -
对,那么您必须使用虚拟类。像这样:reasonml.github.io/try/…