术语“真实”的面向对象是什么意思

时间:2008-10-30 12:52:05

标签: c# ruby oop

我听过很多关于Ruby的内容,甚至Javascript可能是“真正的”面向对象语言,而不是C ++和C#,它们是面向类(或基于模板)的语言。真正的OO是什么意思?这对于类/模板方法有什么好处?

8 个答案:

答案 0 :(得分:14)

这是用于宣传语言的主观术语。我曾经看过,与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: / p>

  

Smalltalk是一种'纯'OO语言,   这意味着,与Java和C ++不同,   价值之间没有区别   它们是对象和值   原始类型。在Smalltalk,   原始值,如整数,   布尔和人物也是   对象,就它们而言   相应类的实例,   并且调用它们的操作   发送消息。程序员可以   更改实现的类   原始值,使新的行为   可以为他们定义   实例 - 例如,实现   新的控制结构 - 甚至是如此   他们现有的行为将是   改变。这个事实总结如下   常见的短语“In   Smalltalk一切都是一个对象“   (更确切地说是   表示为“所有值都是对象”,   因为变量不是。)

答案 1 :(得分:2)

C ++问题如下。 C ++类仅存在于源语法中。没有带有属性和方法的运行时类对象。

在Python中,一切都是对象。对象的类是另一个对象,具有自己的方法和属性。对于smalltalk环境也是如此,这也是一种面向对象的基准。

我认为“真正的”面向对象指的是那些一切都是对象的环境。

[Java没有这个,因为它有原始类型。]

答案 2 :(得分:2)

我认为它可能指的是Prototype Based ProgrammingProgramming Paradigm其中:

  

不存在类,并且通过克隆用作原型的现有对象的过程来执行行为重用(在基于类的语言中称为继承)。此模型也可称为无类,面向原型或基于实例的编程。

另见Ruby singleton methods

答案 3 :(得分:2)

C ++问题如下。 C ++类仅存在于源语法中。没有带有属性和方法的运行时类对象。

当然,根据该规则, 在传统的机器架构上没有面向对象编程这样的东西,因为在机器代码级别没有具有属性和方法的运行时类对象。 (或者,至少除了旧的System/38AS/400等专业架构外,没有。)

object oriented”的意思很久以前就已解决为三件事:abstract data typesinheritancepolymorphism。 (链接的维基百科文章在某种程度上混淆了OO的属性和好处。但重要的区别在于OO和“object based”系统之间。)

一般来说,“X不是真正面向对象,与Y不同”,实际上意味着“我正试图卖给你Y”。

答案 4 :(得分:1)

“真实”或“纯粹”面向对象的语言通常指的是所有内容都是包含基本类型的第一类对象的语言。例如,在C ++和Java中,原始类型int,char等不是对象。例如,在Ruby中,一切都是对象。有时,定义会隐含其他标准,具体取决于您与谁交谈。

答案 5 :(得分:1)

对“真正的面向对象”这个术语的另一种解释是,你可以采用一些不支持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);
}

实现继承和多态的技术已经使用了很长时间。一个例子是GObject框架,用作gtk +的基础。

现在,虽然您可以以面向对象的方式进行编程,但C不支持面向对象,但仅允许您在某种程度上模拟它。所以你没有真正的面向对象。看看C ++ / Java / C#,您可以直接支持所有这些类型的东西,例如继承/数据封装和东西。

答案 6 :(得分:0)

术语“真正的面向对象”具有相同的含义 作为朴素的术语“面向对象”。

当将限定符“true”添加到“手头的主题”时,人们试图提醒读者在当前话语范围内存在所述主题的一个或多个“不完整的模仿”,可交替使用,但与主语相比,缺乏对话语具有重要意义的一种或多种属性。

此类使用通常应遵循主题属性的描述,或“模仿主题”中缺失的属性的描述,或两者;从而引导读者理解或至少考虑这些区别。

由创造短语的人使用的面向对象似乎包含以下属性:

  • 将(数据+行为)封装到仅通过(消息)进行通信的(对象)中。
  • 自动回收用于表示(对象)的内存,
       当所述(对象)不再被引用时。
  • 将(含义)延迟绑定到对象的(表示)上。
  • 从(对象)到(对象的属性)的运行时反射。

实践和经验教导,
也是必要的,包含

  • 闭包    (有时被称为“真正的封闭”,
         正式意义上的含义(封闭),
         并遵循(lisp)中的闭包示例    )

答案 7 :(得分:-1)

不确定您提供的示例之后的区别。但我确实知道它不是什么!当OO被用螺栓固定在一种语言上作为事后的想法,例如Perl OO。