对封装、继承、多态概念的个人形象理解

时间:2021-10-26 21:57:09

从前有一家IT公司,里面有很多人,每个人都有自己的年龄、身高、性别,等等。这些人在这家IT公司里从事着不同的职业,有负责接待的前台,有负责销售的业务员,有负责招聘的HR,有负责扫地的清洁工,还有很多很多负责敲代码的码农。

___________________________________________________________________________

对象A:前台小妹/属性:20岁,168cm,女/行为:吃饭、走路、说话、接待

对象B:业务员老王/属性:30岁,175cm,男/行为:吃饭、走路、说话、销售

对象C:人事小花/属性:25岁,165cm,女/行为:吃饭、走路、说话、招聘

对象D:清洁工大妈/属性:40岁,160cm,女/行为:吃饭、走路、说话、扫地

对象E:码农阿磊/属性:20岁,170cm,男/行为:吃饭、走路、说话、敲代码

__________________________________________________________________________

 

封装:

首先,属性可用来描述同一类事物的特征,行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用。比如人这个东西,可用下面的方式封装:

人{

  年龄(属性一)

  身高(属性二)

  性别(属性三)

 

  吃饭(行为之一)

  走路(行为之二)

  说话(行为之三)

}

 

继承:

由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如码农,简单封装起来如下:

码农{

  年龄(属性一)

  身高(属性二)

  性别(属性三)

 

  吃饭(行为之一)

  走路(行为之二)

  说话(行为之三)

 

  敲代码(行为之四)

}

上面对“码农”的封装,与对“人”的封装基本上差不多,只是多了一个特征行为:敲代码,码农有与人一样的共性,但我们不能说“人敲代码”,也就是不能把敲代码封装到“人”之中去,敲代码是码农的特征行为之一。为了省事地封装码农(代码的复用,这只是继承存在的原因之一),可以让码农去继承人,如:

码农 extends 人{

  敲代码(行为之四)

}

这样,我们就不用重新定义那些已经被“人”这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展码农专有的行为,即“敲代码”即可把码农描述出来:这样的结果,即是码农也同时拥有“人”之中所封装的一切属性与行为,还拥有自己的特征行为“敲代码”。

 

多态:

多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)。

简单理解一下多态,比如:

人这个类,封装了很多人类共有的特性;

码农是人的子类,继承了人的属性与行为,当然码农有自己的特征行为,比如编程敲代码;

前台是人的子类,继承了人的属性与行为,当然前台有自己的特征行为,比如接待收快递;

现在,当我们需要去描述码农与前台各自的行为的时候,我们可以分开来说“码农在敲代码”,“前台在接待”,但如果我们要站在抽象的角度,也就是从码农与前台的父类“人”的角度,来同时描述他们各自的行为时,我们怎么描述?“人在敲代码”?“人在接待”?这是不是怪怪的很不合适?不合适的问题就在于,对于行为主体,我们使用了抽象层次的东西“人”,而对于行为本身,我们却使用了具体的东西“接待”与“敲代码”。怎么解决呢? 那就需要解决抽象与具体的矛盾问题。

既然是站在抽象的角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如“人在干活”(码农在敲代码与前台在接待都可以说成人在干活),这样就解决了抽象层次与具体层次之间的矛盾。

到了这一步,我们可以把两个描述:“码农在干活”,“前台在干活” 两者统一为“人在干活”,然后,我们可以在“码农”的“干活”行为中去调用码农自己的特征行为“敲代码”,在“前台”的“干活”行为中去调用前台自己的特征行为“接待”,所以,当调用“人”去“干活”的时候,如果这个人是码农,那他所做的事实际上就是“敲代码”,如果这个人是前台,那他所做的事实际上就是“接待”。

也就是说在这里“人”是多态的,在不同的形态时,特征行为是不一样的,这里的“人”,同时有两种形态,一种是码农形态,一种是前台形态,所对应的特征行为分别是“敲代码”与“接待”。

完成上述的描述过程,其实就是多态机制的体现。

多态,就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。

比如,上班时间到了,老板喊一声:“大家干活了!”于是所有人就各忙各的去了。如果老板不运用多态的方法,那就需要喊一句:“前台去接待了,业务员去销售了,人事去招聘了,清洁工去扫地了,码农去敲代码了……”然后喊完估计就快下班了。

多态比起封装与继承来说要复杂很多,上面的描述很简单,不用去死抠多态两个字,其实只要明白:能站在抽象的角度去描述一件事,而针对这件抽象的事,对于每个个体(具体)又能找到其自身的行为去执行,这就是多态。