从前有一家IT公司,里面有很多人,每个人都有自己的年龄、身高、性别,等等。这些人在这家IT公司里从事着不同的职业,有负责接待的前台,有负责销售的业务员,有负责招聘的HR,有负责扫地的清洁工,还有很多很多负责敲代码的码农。
___________________________________________________________________________
对象A:前台小妹/属性:20岁,168cm,女/行为:吃饭、走路、说话、接待
对象B:业务员老王/属性:30岁,175cm,男/行为:吃饭、走路、说话、销售
对象C:人事小花/属性:25岁,165cm,女/行为:吃饭、走路、说话、招聘
对象D:清洁工大妈/属性:40岁,160cm,女/行为:吃饭、走路、说话、扫地
对象E:码农阿磊/属性:20岁,170cm,男/行为:吃饭、走路、说话、敲代码
__________________________________________________________________________
封装:
首先,属性可用来描述同一类事物的特征,行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用。比如人这个东西,可用下面的方式封装:
人{
年龄(属性一)
身高(属性二)
性别(属性三)
吃饭(行为之一)
走路(行为之二)
说话(行为之三)
}
继承:
由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如码农,简单封装起来如下:
码农{
年龄(属性一)
身高(属性二)
性别(属性三)
吃饭(行为之一)
走路(行为之二)
说话(行为之三)
敲代码(行为之四)
}
上面对“码农”的封装,与对“人”的封装基本上差不多,只是多了一个特征行为:敲代码,码农有与人一样的共性,但我们不能说“人敲代码”,也就是不能把敲代码封装到“人”之中去,敲代码是码农的特征行为之一。为了省事地封装码农(代码的复用,这只是继承存在的原因之一),可以让码农去继承人,如:
码农 extends 人{
敲代码(行为之四)
}
这样,我们就不用重新定义那些已经被“人”这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展码农专有的行为,即“敲代码”即可把码农描述出来:这样的结果,即是码农也同时拥有“人”之中所封装的一切属性与行为,还拥有自己的特征行为“敲代码”。
多态:
多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)。
简单理解一下多态,比如:
人这个类,封装了很多人类共有的特性;
码农是人的子类,继承了人的属性与行为,当然码农有自己的特征行为,比如编程敲代码;
前台是人的子类,继承了人的属性与行为,当然前台有自己的特征行为,比如接待收快递;
现在,当我们需要去描述码农与前台各自的行为的时候,我们可以分开来说“码农在敲代码”,“前台在接待”,但如果我们要站在抽象的角度,也就是从码农与前台的父类“人”的角度,来同时描述他们各自的行为时,我们怎么描述?“人在敲代码”?“人在接待”?这是不是怪怪的很不合适?不合适的问题就在于,对于行为主体,我们使用了抽象层次的东西“人”,而对于行为本身,我们却使用了具体的东西“接待”与“敲代码”。怎么解决呢? 那就需要解决抽象与具体的矛盾问题。
既然是站在抽象的角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如“人在干活”(码农在敲代码与前台在接待都可以说成人在干活),这样就解决了抽象层次与具体层次之间的矛盾。
到了这一步,我们可以把两个描述:“码农在干活”,“前台在干活” 两者统一为“人在干活”,然后,我们可以在“码农”的“干活”行为中去调用码农自己的特征行为“敲代码”,在“前台”的“干活”行为中去调用前台自己的特征行为“接待”,所以,当调用“人”去“干活”的时候,如果这个人是码农,那他所做的事实际上就是“敲代码”,如果这个人是前台,那他所做的事实际上就是“接待”。
也就是说在这里“人”是多态的,在不同的形态时,特征行为是不一样的,这里的“人”,同时有两种形态,一种是码农形态,一种是前台形态,所对应的特征行为分别是“敲代码”与“接待”。
完成上述的描述过程,其实就是多态机制的体现。
多态,就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。
比如,上班时间到了,老板喊一声:“大家干活了!”于是所有人就各忙各的去了。如果老板不运用多态的方法,那就需要喊一句:“前台去接待了,业务员去销售了,人事去招聘了,清洁工去扫地了,码农去敲代码了……”然后喊完估计就快下班了。
多态比起封装与继承来说要复杂很多,上面的描述很简单,不用去死抠多态两个字,其实只要明白:能站在抽象的角度去描述一件事,而针对这件抽象的事,对于每个个体(具体)又能找到其自身的行为去执行,这就是多态。