最近,我们开始学习计算机图形学,由于我们专业是设计专业,关于代码方面的课程总是浅尝辄止,一些同学很苦恼,他们知道我在计算机学习方面有一定的深入,就跑来问我很多问题,其中一个普遍的问题就是:“面向对象到底是什么?”
其实,在我最早学习代码的时候,遇到的第一个难题就是这个,当时,我花了很多时间,通过了各种渠道,才算弄懂了这个问题。但我花了不少功夫给同学们讲,他们表示并不是太懂。于是回想当时学习面向对象的经历,尝试把学到的内容提炼出来,讲给他们听,果然有所成效。
第一重境界:拟物,让概念具象
①什么是面向对象?
收音机怎么使用?相信大家都会。但收音机由什么组成呢?相信大家都不知道了。这便是面向对象,即使用对象时,只关注对象提供的功能,不关注内部细节。
②什么是对象?什么是属性和方法?
收音机由一大堆零件构成,被组合和包装后提供相应的功能。故对象是一个整体,对外提供一些操作。
它的外壳是塑料,按钮是金属。这就是对象的属性。按下其中一个按钮就可以播放接收到的声音,这就是对象的方法。
③面向对象有哪些特点?(封装、继承、多态,但对于他们,先只讲封装和继承)
我们把收音机包装起来,不在乎它的内部结构。这就好比是封装,即不考虑内部实现,只考虑功能使用。比如说:
class Clock
{
public: //共有成员,外部接口
void SetTime(int NewH,int NewM,int NewS);
void ShowTime();
private: //私有成员,外部无法访问
int Hour,Minute,Second;
}
我们想改装收音机,使得它便携,我们就给手机加上一个手柄,这样得到的东西,拥有收音机全部的特性和功能,但又多了自己的特性和功能。这就是继承,即从已有基类上,派生出新的基类。比如说:
classDerive:privateBase1,publicBase2{};
这样,他们就对面向对象有了基本的概念,而且纷纷表示我讲的他们都明白了,这让我很有成就感。但是,很快问题就出现了,他们很快就跑来问各种问题——类和对象有什么区别?继承里面的pubilic、private等到底是什么?……问题一个接一个,我发觉并不能一次性有效地解决完,于是我开始反省,我的确用拟物让概念具象,但面向对象是一个不小的知识体系,想一下子讲清楚很难,但概念与概念间没有产生联系,所以他们不能够自行解决问题,于是我调整了讲法,使得整体的思路更加清晰。
第二重境界:系统图加讲故事,让概念成体系。
我就先讲故事:从前有一群工人,负责生产收音机,造出来的收音机各式各样,但用的材料和提供的功能是相同的,于是有一天有个人就造了一台机器,这台机器可以生产无数台收音机。这台机器就是类,这个收音机就是对象,而收音机怎么使用呢?(见上第一重境界)……
在这个故事里,我用了连贯的手法叙述所有的概念,使得他们一目了然,再结合系统图,使得他们对面向对象的有了整体的把握,这样问问题的同学越来越少,因为他们终于有了自学的能力。
第三重境界:教学相长,品物外之趣
经过这次的“教学经历”,我也体验了一盘小老师的乐趣,可以说学习十几年,作为学生,我们最熟悉的职业是教师,所以我一直也在思考究竟什么样的方式才是真正好的教学方式。我身边有很多好老师,甘于奉献,循循善诱,他们一直想让教育回归本质。我想这次的经历或许能带来某些启示,即用正确的方式让学生了解整个课程体系,用巧妙的方式激发他们的兴趣和潜能,再让他们根据自己的兴趣和能力选择一方面深入学习,这样的教育可能才更加接近本质。
值得一提的是,后来一个同学跑来问我,既然现在都有了造收音机的机器了,那我们为什么还要拼命去学习怎么造收音机呢?
这个问题很好,我当时没有立刻回答。我经过了一夜的思考,告诉他:“虽然我们有了这么多机器,但都是别人制造的,我们要想真正的创新,就首先要追本溯源去学习原理,这就好比英文虽然有无数个单词,但都是由26个字母按照一定的规则排列的,学习这些基本的原理,不仅更容易让我们记住这些单词,还给我们提供了制造新词语的能力。同理,计算机语言学习亦是如此。”
这不就是教学相长么?
赚到就要给(奉献),学到就要教(传承)。况且,在帮助他人的同时,我们的能力、思想和境界就能更上一层楼!