【发布时间】:2010-09-19 23:42:04
【问题描述】:
我听说过很多关于 Ruby 甚至可能 Javascript 是“真正的”面向对象的语言,而不是 C++ 和 C#,它们是面向类(或基于模板)的语言。真正的 OO 是什么意思,与类/模板方法相比有什么优势?
【问题讨论】:
我听说过很多关于 Ruby 甚至可能 Javascript 是“真正的”面向对象的语言,而不是 C++ 和 C#,它们是面向类(或基于模板)的语言。真正的 OO 是什么意思,与类/模板方法相比有什么优势?
【问题讨论】:
不确定您对所提供示例的区别。但我知道它不是什么!当 OO 作为事后的想法被固定在一种语言上时,例如Perl 面向对象。
【讨论】:
C++ 问题如下。 C++ 类仅存在于源语法中。没有具有属性和方法的运行时类对象。
在 Python 中,一切都是对象。一个对象的类是另一个对象,它有自己的方法和属性。 smalltalk 环境也是如此,它是面向对象的一种基准。
我认为“真正的”面向对象是指一切都是对象的环境。
[Java 没有做到这一点,因为它有原始类型。]
【讨论】:
我认为它可能指的是Prototype Based Programming,Programming Paradigm,其中:
类不存在,行为重用(在基于类的语言中称为继承)是通过克隆作为原型的现有对象的过程来执行的。这种模型也可以称为无类、面向原型或基于实例的编程。
【讨论】:
“真”或“纯”面向对象的语言通常是指一切都是一流对象的语言,包括原始类型。例如,在 C++ 和 Java 中,基本类型 int、char 等不是对象。例如,在 Ruby 中,一切都是对象。有时,定义中会隐含附加标准,具体取决于您与谁交谈。
【讨论】:
这是一个用于宣传语言的主观术语。我曾经看到,与 C++ 相比,C# 和 Java 是真正的面向对象语言,因为一切都必须在一个类中(没有全局函数或变量),并且所有对象都继承自一个 Object 类。
对于 Ruby,它可能是指 Ruby 如何将所有内容都视为对象,因此您可以编写 1.to_s,而不是 str(1) 或 String.valueOf(1)。这是因为 Ruby 不区分值变量和引用变量。在 Javascript 中没有类,您只需创建可以克隆以供重复使用的可扩展对象,这种编程风格被称为 Prototype-based programming。
另一方面,C++ 被宣传为一种多范式语言,它允许您使用多种方法,例如面向对象、通用和过程编程。它不拘泥于一种范式。
但是,是的,这只是一个主观术语,可能意味着任何事情。通常它指的是该语言是否更强调对象而不是函数、模板等其他语言元素。Wikipedia's article on SmallTalk 称其为“纯”面向对象的语言,该描述也适用于 Ruby:
Smalltalk 是一种“纯”OO 语言, 这意味着,与 Java 和 C++ 不同, 值之间没有区别 它们是对象和值 原始类型。在 Smalltalk 中, 原始值,例如整数, 布尔值和字符也是 对象,在某种意义上,它们是 对应类的实例, 并且对它们的操作由 发送消息。程序员可以 更改实现的类 原始值,以便新的行为 可以为他们定义 实例——例如,实现 新的控制结构——甚至如此 他们现有的行为将是 改变了。这一事实总结在 常听到的短语“在 Smalltalk 一切都是对象” (更准确地说是 表示为“所有值都是对象”, 因为变量不是)。
【讨论】:
“真正的面向对象”这个术语的另一种解释是,您可以采用一些自身不支持 OOP 的语言,并在其之上坚持一种 OOP 的做事方式。例如,您可以在 C 中对封装进行建模,例如
typedef struct foo_ {
T1 (*getA)(foo * self);
void (*setA)(foo * self, T1 a_);
/* private: */
T1 a_;
} foo;
T1 foo_getA(foo * self) {
return self->a_;
}
void foo_setA(foo * self, T1 a_) {
self->a_ = a_;
}
foo * foo_create() {
foo * f = malloc(sizeof(foo));
f->getA = foo_getA;
f->setA = foo_setA;
return f;
}
void foo_destroy(foo * f) {
free (f);
}
void doSomething(T1 a) {
foo * f = foo_create();
f->setA(f, a);
foo_destroy(f);
}
实现继承和多态的技术已经使用了很长时间。一个例子是用作 gtk+ 基础的GObject 框架。
现在,虽然您可以以面向对象的方式进行编程,但 C 不支持面向对象,而只是允许您在某种程度上模拟它。所以你没有真正的面向对象。看看 C++/Java/C#,你已经支持所有这些类型的东西,比如继承/数据封装和第一手资料。
【讨论】:
C++ 问题如下。 C++ 类仅存在于源语法中。没有具有属性和方法的运行时类对象。
当然,根据这条规则,在传统的机器架构上没有面向对象编程之类的东西,因为在机器代码级别不存在具有属性和方法的运行时类对象。 (或者,至少,除了像旧的 System/38 或 AS/400 这样的专用架构之外,没有其他的。)
“object oriented”的含义很久以前就被确定为三件事:abstract data types、inheritance 和 polymorphism。 (链接的维基百科文章在某种程度上混淆了OO的属性和好处。但重要的区别在于OO和“object based”系统。)
一般来说,“X 不是真正面向对象,不像 Y”真正的意思是“我想卖给你 Y。”
【讨论】:
术语“真正的面向对象”具有相同的含义 作为朴素的术语“面向对象”。
当将限定词“真实”添加到“手头的主题”时,人们试图提醒读者在当前的话语世界中存在对所述主题的一个或多个“不完全模仿”,它们是可以互换使用,但与主语相比,缺少一个或多个对话语具有重要意义的属性。
此类使用后通常应附有对主体属性的描述,或对“模仿主体”中缺少的属性的描述,或两者兼而有之;从而引导读者理解,或者至少思考一下区别。
创造这个短语的人使用的面向对象似乎包括以下属性:
实践和经验告诉我们,
必要时,包括
【讨论】: