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
。它有三个属性:id
,db
和title
。前两个属性是“空闲的”:它们尚未绑定到任何对象。第三个属性title
已经绑定到对象db.query
的副本。对象book
是抽象的,因为它有一些空闲属性,它不足以指代现实世界中的特定实体。
构造db.query
从绑定到属性db
的对象中获取抽象对象query
的副本,并指定两个参数:SQL字符串和id
。复制抽象对象的过程称为“应用程序”,因为它与在函数式编程中对函数应用参数非常相似。
使用抽象book
的正确方法是制作它的副本,并指定参数:
在这里,42
是id
,mysql
是db
,而b
是一个新对象—book
的一个副本。在𝜑-演算中,这可以写为以下公式:
为了获取 b
的 title
并将其命名为 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