【问题标题】:OOP - How to create an instance of one type called to another type in ReasonOOP - 如何在 Reason 中创建调用另一种类型的一种类型的实例
【发布时间】: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/…

标签: oop ocaml reason


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多