Abstract Objects

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

你如何在面向对象的语言中创建对象?让我们以一些经典的语言为例,比如C++、Java或C#。首先你需要定义一个类,然后创建一个实例。第一步被称为抽象,而第二步被称为实例化。函数式编程中也存在类似的一对操作:声明一个函数是抽象,而使用特定参数调用该函数是应用。问题是:为什么面向对象编程需要类和对象,而函数式编程只需要函数就能够运行?

这是EO中的一个抽象对象:

对象的名称是book。它有三个属性:iddbtitle。前两个属性是“空闲的”:它们尚未绑定到任何对象。第三个属性title已经绑定到对象db.query的副本。对象book是抽象的,因为它有一些空闲属性,它不足以指代现实世界中的特定实体。

构造db.query从绑定到属性db的对象中获取抽象对象query的副本,并指定两个参数:SQL字符串和id。复制抽象对象的过程称为“应用程序”,因为它与在函数式编程中对函数应用参数非常相似。

使用抽象book的正确方法是制作它的副本,并指定参数:

在这里,42idmysqldb,而b是一个新对象—book的一个副本。在𝜑-演算中,这可以写为以下公式:

为了获取 btitle 并将其命名为 t,我们只需执行以下操作:

我们还可以将所有内容放在一行中。

可以对抽象对象应用一些参数,同时保留其他属性的自由。例如,这将创建另一个抽象对象,仍然需要指定id才能成为一个封闭对象。

后缀 :db 帮助编译器理解应该将自由属性绑定到对象 mysql。稍后,x 可以再次复制,将创建一个闭合对象 b

尽管EO的语法允许使用 book.title,但这会导致编译时错误:禁止访问抽象对象的自由属性或依赖其他自由属性的属性。然而,假设我们给book添加一个新属性print,为了将其id打印到控制台,我们可以执行以下操作:

属性print不需要绑定db属性,因为它不使用它。可以只使用id复制book,然后调用print(假设在EO交互式控制台中进行)。

顺便问一下,你知道还有其他具有抽象对象的语言吗,还是EO是第一个引入这种设计的?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:24

sixnines availability badge   GitHub stars