是否有任何不基于类范式的面向对象的编程语言?
是否有任何不基于类范式的面向对象的编程语言?
Answers:
据我所知,Self是发明基于原型的“无类”范例的原始语言。它早在1980年代就已经存在(处于实验阶段),并将Smalltalk对原型模式的优雅使用推向了极致,从而完全消除了类。
它影响了我所知道的所有其他“无类” OO语言:
像JavaScript这样的语言是基于原型的,通过克隆现有对象来重用行为。我链接到的Wikipedia文章表明Lua,ActionScript和许多其他语言都遵循此范例。
世界上最流行的面向对象编程语言没有类,它被称为Javascript且基于原型:http : //en.wikipedia.org/wiki/Prototype-based_programming
面向对象是几个重要概念的总称,这些概念仅部分地相互依赖。例如,继承可以在实例之间而不是在类之间根据情况进行声明,或者prototype
像Thomas所写的那样,整个类可以由具体对象表示 。将结构描述与实例创建分开是更常见的做法。同样,后期绑定意味着具有名义上相同方法的对象在调用时不一定执行相同的操作,并且决策是在运行时做出的。使用基于原型的方法同样可能。封装本质上完全独立于您的对象是否是已声明类的实例。
也就是说,大多数面向对象的语言都牢牢地基于类。但是即使那样,也有一些习惯用法使界限模糊:领域驱动的设计通常会导致系统中特定对象的标识比静态类图重要得多,并且装饰器允许相同类或接口的对象具有非常高的静态性。不同的行为。
Fortress是一种基于特征而非类的面向对象的语言。区别主要在于实现组成。对象的行为(方法定义)仍然由程序文本中特定点处的声明确定。因此从某种意义上讲,它类似于基于类的系统。
有一些对象计算(我认为是Cardelli),完全基于对象。每个方法都是实例成员。您可以通过获取现有对象的内容并添加,删除或替换其某些成员来形成新对象。它与原型稍有不同,因为新对象没有指向旧对象的链接,只是其中的一些内容。
IIRC,可以使用Python和其他面向哈希表的语言以类似的方式进行编程:您可以将函数添加为实例成员,然后将其作为方法调用。
Ada,自1995年修订版起,Ada是面向对象的,但是与许多其他OO语言不同,它没有将面向对象的类型和模块组合到称为“类”的单个结构中。您无需声明一个类型为“ class Foo”,而是将所有关联的方法声明放入该类声明中,而是声明一个包并声明该类型(作为record
)和包中的其他内容。它不是像其他提到的语言那样“无类”的,它只是组织事物的方式略有不同。
Ada 95的面向对象功能已添加到该语言的现有1983版本中。它扩展了现有的记录和包结构以支持继承等。
Io是另一种基于原型的面向对象语言。实际上,它是从其他答案中已经提到的几种语言中汲取灵感的。
IO是一种动态的基于原型的编程语言。Io中的思想主要受Smalltalk(所有值都是对象),Self(基于原型),NewtonScript(差异继承),Act1(并发的actor和future),Lisp(代码是运行时可检查/可修改的树)和Lua(小,可嵌入)。