我有兴趣以比我现在更加学术和抽象的方式理解面向对象的编程,并想知道是否有任何面向对象的概念,Java和C ++无法实现。
我意识到这两种语言都不是“纯粹的”OO,但我对他们缺乏的东西(如果有的话)感兴趣,而不是他们有额外的东西。
答案 0 :(得分:15)
在the words of Alan Kay中,“面向对象”一词的发明者:
OOP对我来说只意味着本地消息 保留,保护和隐藏 国家进程和极端 所有事情的后期约束力。有可能 在Smalltalk和LISP中完成。那里 可能是其他系统 这是可能的,但我不知道 它们。
C ++显然未能通过“极端后期绑定”标准,并且由于其严格的类/方法结构,Java和C ++都无法通过“消息传递”标准。据我了解,Kay的概念认为具有特定名称和签名的方法是实现消息处理程序的便捷方式,但绝不是唯一的方法。
同一封电子邮件中的其他有趣陈述:
我不喜欢Simula I或者 Simula 67做了继承[...]所以我 决定遗漏继承作为 内置功能,直到我理解为止 更好。
和
强加了术语“多态性” 很久以后(我认为Peter Wegner) 并且它不是很有效,因为它确实来自函数的命名,我想要比函数更多的东西。
答案 1 :(得分:8)
在我的头顶,我会说:
答案 2 :(得分:3)
两者都区分了基元和对象,所以它们都不是纯粹的面向对象。
答案 3 :(得分:2)
还有另一种思考面向对象编程的方法,它与Java和C ++中基于类的系统不同。 JavaScript使用基于原型的编程。如果你想看看全部的OOP风格,可能值得一看:http://en.wikipedia.org/wiki/Prototype-based_programming
答案 4 :(得分:1)
Java没有多重继承,但有些人可能会说这更像是一种祝福,因为它要求用户考虑正确的体系结构。您可以使用接口和抽象类来解决这个问题。
多重继承因其在某些语言中引起的以下问题而受到批评,特别是C ++:
答案 5 :(得分:1)
Java:原始类型不是对象。
答案 6 :(得分:1)
面向对象编程的最重要特征是封装。隐藏实现细节对于编写可维护代码显然至关重要。
在C ++中,由于你有不受控制的指针,一个写得不好的对象可能会做任何事情。这意味着封装被破坏,并且很难找到错误。
Java没有这个问题,但缺乏基本的常量。这不是严格意义上的面向对象的理论特性,但是能够声明一个方法是只读的,或者一个对象是只读的,是C ++中一个非Java的非常好的可靠性增强器。
最后,java的模板机制是对C ++的模仿。无法对类进行参数化是Java的巨大损失。
因为Java不支持指向方法的指针,并且反射太慢,所以当函数指针执行时,它会强制使用许多小对象。有些人可能认为这是一件好事。
答案 7 :(得分:0)
Java和C ++都允许程序编程。对某些人来说,这可以被认为是负面的。
答案 8 :(得分:0)
大多数解释语言符合后期绑定要求。在Perl中,您可以从数据库表中提取代码,将其放入解释器,然后实例化您刚刚引入程序的新类的对象。
Python是否完全符合Kay对OOP的定义?我确实没有在Python上做足够的工作。我怀疑没有,因为Python的“本机类型”不是对象。