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


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

    ___________________________________________________________________________

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

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

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

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

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

    __________________________________________________________________________

    封装:

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

    人{

      年龄(属性一)

      身高(属性二)

      性别(属性三)

     

      吃饭(行为之一)

      走路(行为之二)

      说话(行为之三)

    }

    继承:

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

    码农{

      年龄(属性一)

      身高(属性二)

      性别(属性三)

     

      吃饭(行为之一)

      走路(行为之二)

      说话(行为之三)

     

      敲代码(行为之四)

    }

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

    码农 extends 人{

      敲代码(行为之四)

    }

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

    多态:

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
    【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数
    【Azure 应用服务】App Service站点Header头中的中文信息显示乱码?当下载文件时,文件名也是乱码?
    【Azure 应用服务】Azure App Service 自带 FTP服务
    【Azure 微服务】PowerShell中,用Connect-ServiceFabricCluster命令无法连接到sf-test.chinaeast2.cloudapp.chinacloudapi.cn:19000 问题分析
    【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID
    【Azure Developer】Visual Studio 2019中如何修改.Net Core应用通过IIS Express Host的应用端口(SSL/非SSL)
    【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
    Markedown实现
    vue-router的使用之如何让导航栏实现一种动态数据 与 如何实现导航栏刷新页面保持状态不变
  • 原文地址:https://www.cnblogs.com/qiuting/p/5347655.html
Copyright © 2020-2023  润新知