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

时间:2011-06-17 10:02:04

标签: oop object

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

根据Wikipedia,面向对象编程的特征是数据抽象,封装,消息传递,模块化,多态和继承。对我来说,数据抽象,封装,消息传递,模块化也存在于顺序语言中。只有多态和继承特定于面向对象的编程。这是对的吗?

2 个答案:

答案 0 :(得分:6)

许多非OOP语言当然可以构建这些功能。从C与C ++区域看,您可以通过使用不透明指针,使用一组函数来获取/返回这些不透明对象,以及一组内部函数,这些函数都是文件静态的,从而在C中提供封装。您甚至可以使用函数指针和封装对象进行多态和继承。

然后,我们还可以使用汇编语言或机器语言进行编程。将任何功能引入语言的原因是为了更容易使用该功能。

再次,看看C与C ++,处理不透明指针之类是烦人的,重复的和半难的。使用C ++,您可以用更少的代码实现相同的效果。对每个人来说,显而易见的事情是显而易见的。破解要困难得多(虽然并非不可能)。另外,如果需要,可以轻松打破封装,因为您可以定义像friend这样的语言结构,在必要时提供异常。

然后有些东西在没有直接语言支持的情况下很难实现。当然,运算符重载是不可能的,但函数重载确实是,如果没有语言支持,真的很难

最重要的是,如果它是在语言中,那么每个人都以同样的方式做到这一点。在C中有多种实现继承和多态的方法。所有这些方法都彼此不兼容。虽然C ++用户可以使用这些方法中的任何一种,但他们选择使用99.9%的实际语言功能。这意味着更容易阅读其他人的代码并知道发生了什么。你不必猜测什么是不透明的,什么不是。你不必猜测从什么中得到什么。你知道,因为每个人都这样做。

在任何情况下,如果你愿意,大多数OOP-lite语言(C ++,Java,C#)可以或多或少地像程序一样使用。你只需忽略这些对象。因此,在很多方面,他们都能获得两全其美的效果。

答案 1 :(得分:3)

优点可以用这种方式概括:

OOP可以比以前的范例更直接,更精确地代表现实世界,因此程序变得更简单,更容易理解。

关于这个:

  

对我来说,数据抽象,封装,消息传递,模块化也存在于顺序语言中。只有多态和继承特定于面向对象的编程。

大多数人类可读的语言可以提供数据抽象,封装,消息传递和模块化(否则它们将是机器语言),但OOP支持更好的这些概念。例如,要在C中设置窗口小部件的文本,您可以执行以下操作:

HANDLE myEditBox = CreateEditBox(hParent, ...);
SetText(myEditBox, "Hello!");

请注意,您有一个对象的句柄,而不是一个实际的对象。现在用C ++(OOP)你可以做到这一点:

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

差异很微妙,但很重要。 C风格的SetText(句柄," Hello!")没有对句柄和其他参数进行任何区分。你甚至不知道对象有消息。现在是C ++风格的对象.SetText(" Hello!")它就像明确告诉:嘿,对象,将你的文本设置为"你好!"。这里,消息和接收者(对象)的概念是明确的。

如果没有将对象声明为指针,C ++也可以自动销毁对象,从而消除了诸如DestroyObject(myEditBox)之类的调用。

同样没有OOP,你的封装非常糟糕,因为大多数东西是用只包含公共成员的结构实现的。因此,您无法隐藏用户的数据,这意味着某些人可能会尝试以意外的方式更改内容,这可能会导致错误。这在大型项目中非常普遍。