C#是纯粹的面向对象编程语言它真正体现了一切皆为对象的精神在C#中即使是最基本的数据类型如intdoublebool类型都属于SystemObject类型此外使用C#编程不会存在与游离于对象之外的属于过程的东西因此学习C#就必须具有面向对象思想不明白所谓的面向对象思想就不可能掌握C#的精髓而对于C#的理解就只能仅限于语言特色的表面了
很多讲解面向对象思想的书籍和文章喜欢将面向对象与面向过程相比较然而对于学习程序设计的初学者而言是完全没有必要的一张空白的纸张事实上比写满字的纸张更利于未来的发展
那么什么是面向对象思想?其精要当然是一切皆为对象的意义软件的开发与设计是围绕着开发的目标进行的比如开发一个电子商务网站那么与电子商务有关的都是我们要操作和关心的商品订单用户目录购物车等等都是对象如果要开发一个论坛那么论坛中必备的要素如论坛分类主题帖子评论用户也全都是对象从小处说我们要求写一个算法用以计算阶乘那么起始值运算结果以及整个算法都是对象
那么对象具有什么特质?一般而言一个对象应具有属性和行为以现实世界为例人作为一种特殊的动物也是我们所称谓的对象这个对象具有很多属性例如姓名身高体重民族国籍出生年月等等而行为呢可以是行走吃饭跑步乃至于玩游戏踢足球如果从词义学的角度来看属性更偏向于名词的范畴而行为则近乎于动词然而对象也有特殊的情况或者只具有属性或者只具有行为例如身份证可能只具有姓名出生年月籍贯身份证号等属性而没有行为例如飞这本身是一种动作但同样可以认为是一种行为
然而这种划分并非绝对根据实际情况同一种对象具有的属性和行为可能不一样例如同样是人如果是要开发一个户籍管理系统我们就不必去考虑行走吃饭跑步等行为但如果是一个足球游戏那么对象人就需要各种踢足球的动作作为该对象的行为了再比如身份证对象也可能为了使用方便会为它添加IsValidate这样一个行为
还要注意的是很多时候属性其实本身也是一个对象例如姓名可以是string类型它属于SytemObject对象类型我们也可以单独为姓名建立一个类对象
public class Name
{
public string FirstName;
public string MiddleName;
public string LastName;
}
在C#里有各种各样的对象类型除了本身提供的基本类型外还支持自定义各种类型包括classstructenuminterfacedelegateevent以前面的例子来看对象Person人就可以被定义为class类型国籍可以被定义为enum类型没有行为的身份证也可以被定义为struct类型动作飞可以被定义为interface类型至于delegate和event则是一种特殊对象类型例如我们可以为论坛管理系统定义一系列事件如BeforePostAftERPost等等关于这些内容我会在后面的内容中详细讲解
要掌握面向对象思想就必须具备识别系统中对象的能力在我们要开发的系统中哪些需要定义为单独 的对象而且这个对象应该具备哪些属性和行为都是初学者比较头疼的问题要正确地识别对象就需要首先分析该系统所应实现的功能例如我们要求开发一个电子商务系统功能要求如下
支持商品的查询功能
用户如需购买商品需要成为注册用户并登录
如果当前库存无该商品用户可以预订
用户可以将商品放入购物车
用户购买商品之前需提交订单
用户提交订单后系统应将订购信息发送邮件给用户
用户可以对商品添加评论
有一个简单的方法可以帮助我们识别对象就是找出这些功能描述中的关键名词如商品用户购物车订单评论这些词语基本上可以涵盖这个电子商务系统的主要对象了至于对象的属性可以考察该系统对这个对象的要求和所需要的信息例如商品必然要求有商品名价格相关图片所属类别库存量等等至于行为我们还可以从功能描述中去寻找与这些对象名词相关联的动词例如商品的查询就代表商品具有Search行为用户注册与登录就代表该用户具有这两种行为ReGISterSignIn当然隐含的行为自然还包括SignOut
真正要识别好对象也许我们需要掌握UML的知识知道怎么写用例或者利用极限编程的方法把一个个用户故事写出来然后一一识别不过这些知识对于初学者似乎太难了我们现在知道能有这样一个方法就可以了我更希望的是读者在看完本节能够建立起一切皆为对象的思想最后更希望大家能把识别对象看作是一种填字游戏关键不在于答案是什么乐趣全在游戏中了
面向对象思想博大精深不是三言两语就能说清楚的但建立这样一种思想要存乎于你的内心这在与一种妙悟也许在你写了几百个小程序之后还没能体会到面向对象的真谛但是在霎那之间你却突然明白了顿有一种拨开云开见月明的喜悦我不是故意卖弄玄虚有时候开发软件还真需要那么一点灵感有人说编程是一门艺术我同意那么这种妙悟什么时候能来到我无法确知答案这需要你的体悟不过这种体悟与谈禅无关不是每天冥想就可以的还是踏实点多写写程序慢慢你就会明白了