是什么让每个人都从顺序语言转向对象语言?
根据Wikipedia的说法,面向对象编程的特征是数据抽象、封装、消息传递、模块化、多态性和继承。对我来说,数据抽象、封装、消息传递、模块化也存在于顺序语言中。只有多态性和继承是特定于面向对象编程的。这是正确的吗?
发布于 2011-06-17 18:15:28
许多非OOP语言当然可以构建这些特性。从C语言与C++语言的对比来看,您可以通过使用不透明的指针、一套接受/返回这些不透明的对象的函数以及一组完全是文件静态的内部函数来提供C语言的封装。您甚至可以使用函数指针和封装的对象进行多态性和继承。
话又说回来,我们也可能还在用汇编语言或机器语言编程。将任何功能引入一种语言的原因是为了使其更容易使用。
同样,看看C和C++,处理不透明的指针和类似的东西是恼人的,重复的,半困难的。使用C++,您可以用更少的代码实现相同的效果。这对每个人来说都是显而易见的。要打破这一点要困难得多(尽管并非不可能)。此外,如果需要,您可以轻松地打破封装,因为您可以定义像friend这样的语言结构,在必要时提供异常。
还有一些事情,如果没有直接的语言支持,是很难实现的。运算符重载当然是不可能的,但函数重载在没有语言支持的情况下真的很难做到。
最重要的是,如果它是用语言写的,那么每个人都是以同样的方式来做的。在C中有多种实现继承和多态性的方法,所有这些方法都是相互不兼容的。虽然C++用户可以使用这些方法中的任何一种,但他们99.9%的时间都选择使用实际的语言功能。这意味着阅读其他人的代码并了解正在发生的事情要容易得多。你不必猜测什么是不透明的,什么是不透明的,你也不必猜测什么是从什么派生出来的。你知道的,因为每个人都是这样做的。
在任何情况下,如果您愿意,大多数OOP-lite语言(C++、Java、C#)都可以像过程化语言一样使用。你只需忽略这些对象。因此,在许多方面,他们都是两全其美。
发布于 2011-06-17 19:12:53
优势可以用下面的方式来概括:
与以前的范例相比,OOP可以更直接、更精确地表示现实世界,因此程序变得更简单、更容易理解。
关于这一点:
For me的数据抽象、封装、消息传递、模块化也存在于顺序语言中。只有多态性和继承是特定于面向对象编程的。
大多数人类可读的语言可以提供数据抽象、封装、消息传递和模块化(否则它们将是机器语言),但OOP更好地支持这些概念。例如,要在C中设置小工具的文本,您可以这样做:
HANDLE myEditBox = CreateEditBox(hParent, ...);
SetText(myEditBox, "Hello!");注意,你有一个对象的句柄,而不是一个实际的对象。现在,在C++ (OOP)中,您可以这样做:
EditBox myEditBox(...);
myEditBox.SetText("Hello!");区别是细微的,但却很重要。C风格的SetText(句柄,“你好!”)不对句柄和其他参数进行任何区分。你甚至不知道这个对象有一条消息。现在是C++风格的object.SetText("Hello!")这就像是明确地说:嘿,对象,将你的文本设置为"Hello!“。这里,消息和接收者(对象)的概念是明确的。
如果对象没有声明为指针,C++还可以自动销毁对象,从而消除了诸如DestroyObject(myEditBox)之类的调用。
如果没有OOP,你的封装也会非常糟糕,因为大多数东西都是用只包含公共成员的结构实现的。所以你不能对用户隐藏数据,这意味着somenone可能会试图以一种意想不到的方式改变事情,这可能会导致错误。这在大型程序中很常见。
https://stackoverflow.com/questions/6384188
复制相似问题