面向对象编程 - 如何在Reason中创建接口

3

假设我有以下抽象产品类abstractProductA,其中有一个名为methodA的公共方法:

class abstractProductA = {
  pub methodA => "name";
};

我希望创建一个接口,指定函数 methodA 始终返回一个 string。类似于:

interface abstractProductA {
  abstractProductA(): string
}

只有在合理的情况下,才能实现该类。欢迎提出任何建议。谢谢

1个回答

1
您似乎是在询问如何定义和使用抽象类,OCaml/Reason 中称之为虚拟类:
class virtual virtualProductA = {
  pub virtual methodA: string;
};

class abstractProductA = {
  inherit virtualProductA;
  pub methodA = "name";
};

接口更多地是为了让消费者抽象出一个实现,虚类本身可以用作接口,但由于OCaml / Reason对象是结构类型化的,因此您也可以只指定所需的对象类型。当然,如果您愿意,也可以将其绑定到名称:

type interfaceA = {.
  methodA : string
};

let f (p: interfaceA) => Js.log p#methodA;
f (new abstractProductA);

在这个上下文中,结构类型仅意味着您不必提前定义关系。您无需明确指定abstractProductA实现了interfaceA,它通过简单地实现相同的“结构”,即具有相同名称和类型的方法来隐式地实现。 - glennsl
1
我已经为上面的接口添加了一个用法示例。您也可以将finterfaceA类型替换为virtualProductA,以使用该定义作为“接口”。 - glennsl
1
有时候为了确保类是给定类类型的子类型,将约束添加到 self 类型中也是很有用的,例如 constraint 'self = {. m: string ; .. } - octachron
1
@octachron 对的,这个的 Reason 语法应该是 {.. m: string }。我也略过了一些对象类型的细节,这可能会使它更难理解和使用,比如整个行多态的事情以及无法将其绑定到名称(如果需要的话)。 - glennsl
1
我没有使用过Reason,只是OCaml的忠实粉丝。 结构类型的真正好处在于它鼓励您以更模块化的方式编写代码,而名义类型则更适合处理更复杂的关系。就名义类型更适合处理更复杂的关系而言,我认为这是一种误解,基于人们习惯于多重继承,而在我的经验中,使用函数器和包含语句作为替代方案可以满足我的需求。 - XGoVoid
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接