由于我们在上一节展示了Helloworld示例,在那个示例中提到了许多的概念,例如命名空间、类型、对象等概念,这些概念都源自于面向对象编程思想,所以,这一节我们先探讨一下什么是面向对象编程。

首先,我们探讨类型和对象的概念、区别与联系。我们明确地知道张三是一个人,而阿黄是一条狗,小强是一只蟑螂,佩奇则是一只猪。有没有发现它们之间有着某个关联,前者是具体的某个对象,后者更像是一个集合,一个分类,一种类型。没错,如果您能感受到这一点,那么恭喜您,面向对象编程就理解了一半。

我们继续。以一家公司为例。

OOP面向对象编程思想_面向对象编程

观察左右两个组织架构,我们一眼就能融汇贯通,因为两个组织架构似乎在说同一档子事儿。其实不然,左侧为虚,右侧为实;左侧表示一家公司的基本架构大致如此,而右侧确是一家叫大米科技公司的真实组织架构。

比如左侧架构中的工程师,它代表了公司的一个职位,也就是说它表示一个类型。而右侧架构中的黄药师、周博通和杨过三人在这个地方就表示工程师身份。工程师这个类型规定了它的岗位职责或功能是拥有研发产品的能力,而属于工程师类型的黄药师、周博通和杨过自然也备份研发能力。工程师就是一种类型,黄药师、周博通、杨过就是具体的对象。

我们用C#开发的程序,往往都是由多个类型构成,然后将这些类型在需要的时候实例化成对象,并使用这个对象为我们处理相关的业务。

这就好比一个人的公司,当这个人的能力超强,客户越来越多,公司越做越大,他不可能一个人既搞研发生产,又跑市场销售,还要负责人事管理、财务计算和售后服务。那么怎么办呢?他会想:我就专心负责产品研发就好,关于生产和销售的事情,需要设计两个岗位角色,这两个岗位角色分别负责产品的生产和销售,一个叫操作员,一个叫销售员。这时,无形中这位老板就创建了两个类型(针对于他这家公司而言)。

虽然他脑海中有了这样一个想法,目前还是兼职操作员和销售员的事情,直到招聘到合适的人手。直到一周后,一个叫李四的中年男人应聘成功,这时生产的事情就由李四负责。而李四的岗位目前还只是操作员。结论:操作员是类型,李四是属于操作员这个类型的具体对象。

又过了一周,大刀王五来着老板面前毛遂自荐,说他身处江湖,人脉甚广,挺适合帮助老板销售产品,于是二人一拍即合,王五便成了公司的销售员。

三个月后,没想到王五真有本事,有200家客户都签了合同,而且有的客户对产品的功能和性能提出了新的需求,这时,因为销售实在是太好了,把压力都给到新产品研发和生产。老板无奈的想了又想,最后,又设计了些新的岗位,他首先将手头的工作丢出来,将研发设计成一个部门,又设计了部长和工程师两种类型的岗位,亲自担任研发部长,并招聘了黄药师、周博通和杨过负责产品的研发。结论:研发部长和工程师是类型,他自己是研发部长这个类型下的实际对象,黄药师、周博通和杨过则属于工程师类型的实际对象。

终于,老板不必天天在一线搞研发了,有了空闲时间,又成立了生产部,并设计了生产部长这个岗位角色,将李四提拔为生产部长,并招聘了赵志敬、尹志平和甄志丙从事操作员的工作。结论:李四虽然还是具体对象,但不再属于操作员,而是属于“生产部长”这个类型

接着,老板又如法刨制,成立了销售部,提拔了最佳销售员王五担任销售部长,并招聘了沈万三、胡雪岩和吕不韦从事销售工作。在某个周五晚上9点,老板终于下班了,看着窗外的万家灯火,感叹岁月的流光飞舞,忽然之间灵光一现,何不再招一位研发部长,自己退居二线,工作上的事情就让三位部长开会接洽,岂不快哉?于是又招聘了张三担任研发部长。

至此。张三、李四、五王各司其职,公司也蒸蒸日上,而那位老板也得到了解脱,事了拂衣去,深藏功与名。

结论:这位老板其实就隐喻了程序员。程序员开发一套软件,其实就像开设一家公司,会从零开始构架,随着软件的功能越做越大,就要设计更多的类型,并使用这些类型,类型与类型之间,或者对象与对象之间,也会经常“开会”沟通,我们称为类型之间的通信,开会的目的就是沟通,沟通的目的就是数据传递。

面向对象编程的概念

面向对象编程是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。

在OOP编程思想中,类和对象是两个最重要的核心概念。在C#中,object表示对象,对象是可以做一些具体事情的东西。一个对象有状态、行为和标识三种属性。class表示类型,它表示一个共享相同结构和行为的对象的集合。这种说法比较抽象,在上面的例子中,比如工程师这个岗位就像是类型的概念,而黄药师、周博通和杨过就是对象。

定义好一种类型后,可以根据这个类型实例化出千千万万的对象,这些对象拥有类型的结构和行为,但彼此之间又相互独立,它们各自占据不同的内存空间。

关于OOP思想,没有办法一文详尽,下一节,我们继续探讨C#中的类型(class)。

——重庆教主 2023年12月8日