从面向过程到面向对象 --- 思维方式的转变

曾经在学校学习数据结构课程时,第一节课上,老师就告诉我们:程序=数据结构+算法。这句话对我后来学习数据结构起了很大的作用,积极的作用。

可是后来学到C++面向对象部分时,这句话让我在有些地方怎么也想不通。想了很久之后,我得出了另一个结论,在面向对象程序中,程序=对象&行为。这里我使用&,是为了说明对象与行为是关系的。行为是对象的行为,对象要对它自己的行为负责。

这种思维上的转换在从PO到OO的过程中非常重要,下面我举个例子:


假如使用PO的思维,我们想要实现“兔子走路”和“人走路”,我们会怎么做呢? 首先,写一个“兔子”结构体。struct rabbit{}r; 然后是一个“兔子走路”的算法。void rabbitWalk(rabbit r); 最后对“兔子”使用“兔子走路”算法。rabbitWalk(r); “人走路”与“兔子走路”类似:

struct human{}h;
void humanWalk(human h);
humanWalk(h);

这就是数据结构+算法的思维。程序“兔子走路”=数据结构“兔子”+算法“兔子走路”。程序“人走路”=数据结构“人”+算法“人走路”。 如果数据结构“人”+算法“兔子走路”会怎样呢?

如果用OO的方法,这件事情要这么做:
首先创建一个“兔子”对象class rabbit{};rabbit r; 由于兔子需要“走路”这一行为,因此向类中添加这一行为class rabbit{ void walk(){}}; 让“兔子”对象执行它的“走路”行为。r.walk(); 同样地,“人走路”的程序可以这样实现:

Class human : public animal
{void walk(){}};
human h;
h.walk();

在这里,是对象调用它自己的行为。两个“走路”行为虽然同名,但是它们是不相关的。由对象自己决定它们调用哪个“走路”行为,而程序员要做的,只是让对象执行它们的“走路”行为。人没有兔子的走路行为,所以让人用兔子走路的方法是不可能的。