面向对象编程有哪些优势或特点?

6

什么让每个人从顺序语言转向面向对象语言?

根据维基百科,面向对象编程的特点包括数据抽象、封装、消息传递、模块化、多态和继承。对我来说,数据抽象、封装、消息传递和模块化也存在于顺序语言中。只有多态和继承是面向对象编程特有的。这正确吗?


3
几乎所有编程语言,包括面向对象的语言,都是“顺序执行”的(这意味着语句按顺序执行——尽管这些语言通常配备了线程库,让您可以拥有同时执行的线程,每个线程本身都是顺序执行的)。你确定你不是想说“过程式”(这是“面向对象”常见的反义词)吗? - Aasmund Eldhuset
“Sequential language” 是什么意思?我很好奇。 - Nicol Bolas
2个回答

6
许多非面向对象的语言当然可以构建这些功能。就从C和C++的角度来看,您可以使用不透明指针提供C中的封装,使用一组函数来获取/返回这些不透明对象,并使用所有文件静态的内部函数集。您甚至可以使用函数指针和封装对象实现多态性和继承。
再说一遍,我们也可以仍然在汇编或机器语言中编程。将任何功能引入语言的原因是使使用该功能更容易。
同样,从C和C++的角度来看,处理不透明指针等内容很烦人,重复且半难以理解。使用C ++,您可以用更少的代码实现相同的效果。每个人都知道正在发生什么。它更难以被破坏(虽然不是不可能)。此外,如果需要,您可以定义诸如“friend”之类的语言构造来提供异常,从而轻松打破封装。
然后,有些东西确实很难在没有直接语言支持的情况下实现。操作符重载当然是不可能的,但是函数重载在没有语言支持的情况下真的很难做到。
最重要的是,如果它在语言中,则每个人都会以相同的方式执行它。在C中,有多种实现继承和多态性的方法。它们中的所有方法都不兼容。虽然C ++用户可以执行这些方法中的任何一种,但他们99.9%的时间选择使用实际的语言功能。这意味着阅读别人的代码并知道发生了什么要容易得多。您不必猜测什么是不透明的,什么不是。您不必猜测什么是从什么派生的。你知道它,因为每个人都以相同的方式做到了。
无论如何,大多数面向对象轻量级语言(C ++,Java,C#)可以像过程性语言一样使用,如果您愿意,您只需忽略对象即可。因此,在许多方面,它们获得了最佳的两个世界。

4
优势可以总结为:
面向对象编程(OOP)可以比以前的范式更直接和准确地表示现实世界,因此程序变得更简单易懂。
至于这个问题:
对我来说,数据抽象、封装、消息传递、模块化也存在于顺序语言中。只有多态性和继承是特定于面向对象编程的。
大多数可读性强的语言都可以提供数据抽象、封装、消息传递和模块化(否则它们就是机器语言),但是OOP更好地支持这些概念。例如,在C语言中设置小部件的文本,您需要执行以下操作:
HANDLE myEditBox = CreateEditBox(hParent, ...);
SetText(myEditBox, "Hello!");

注意到你手头上只有一个对象的句柄,而不是实际的对象。现在,在C++(面向对象编程)中,你可以这样做:

EditBox myEditBox(...);
myEditBox.SetText("Hello!");

区别微妙但重要。C风格的SetText(handle, "Hello!")不区分句柄和其他参数。你甚至不知道对象有消息。而C++风格的object.SetText("Hello!")就像明确告诉:嘿,对象,将你的文本设置为"Hello!"。在这里,消息和接收者(对象)的概念是显式的。
如果没有声明为指针,C++也可以自动销毁对象,这消除了类似DestroyObject(myEditBox)的调用。
此外,没有面向对象编程,封装性非常差,因为大多数东西都是使用只包含公共成员的结构实现的。因此,您无法向用户隐藏数据,这意味着某人可能会以意想不到的方式更改事物,从而可能导致错误。这在大型程序中非常常见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接