面向对象思想的简单描述
1、什么事面向对象
在很多参考书上都可以看到说“面向对象是要模拟人类的认知过程”,这话说得比较泛,也抽象。
在平时的教学过程中也有不少学生询问到底什么是面向对象,感觉在学校学了很多,但只记得一些概念,到底什么是面向对象还是很混乱。
还有一部分同学认为面向对象就是类,就是字段或方法的封装,其实不然,面向对象实际上是一种编程的思想,类只是用来方便实现的工具。
我常常说传智基础班的内容并不难,主要是弄清两个重点
第一、程序如何写出来
也就是怎么分析问题,拿到一个问题,用程序写出来,肯定遵循一定步骤,先做什么、再做什么、最后做什么
虽然不一定能绝对分析入骨、点点到位,但是需要慢慢的培养思考的习惯,因为一个问题的解决绝对不止一种方法
第二、理解面向对象的概念
C#作为一门面向对象的语言,微软将面向对象的概念在C#里面体现得非常好
同时作为.Net开发者,面向对象开发的准确理解是非常有必要的
我以前看过很多书(现在依旧有看书的习惯),很多C++的书曾描述面向对象的时候,常常提到开发大型程序才能体会面向对象的好处,那么这个好处是什么呢,相信等你读完下面的内容就自然明白了
好了,那到底什么是面向对象呢?
面向对象就是“将程序的执行者变为执行的命令者”
先来看一个例子
倒退100年,人们吃饭怎么完成的呢?
首先要购买材料,人后在家生火,然后加工煮熟(简单的概括)
再看看今天的上班族,怎么吃饭呢?
首先拿起电话,告知对方你要吃什么,然后等着付钱即可
我们会发现前一个例子,我们“事必躬亲”,必须考虑每一个细节,以及每个环节之间的关系。但是后一种方式根本不用考虑任何细节,只要通知一下对方即可
用伪代码描述一下
第一种方式
static void Main(string[] args)
{
选购材料的方法();
生火的方法();
加工处理的方法();
可以吃了;
}
第二种方式
static void Main(string[] args)
{
找到餐厅;
告知需求的方法();
可以吃了;
}
简单的比较一下,实际上面向对象就好像将任务发派到其他地方,所要的只是法号命令,等待结果就行了。其细节和过程都有相应的方法去完成,不用我们考虑
在来看第二个例子
比如现在有位同学想买相机,但是现在市场上相机琳琅满目,不知道如何挑选,大家会怎么办?
OK!不少同学会说上网查!那么大家知道什么是光圈、什么是高感光度,什么是降噪效果吗?实际上相机是一个比较专业的东西
另外,又如何保证相机的质量呢?如何了解购买到的产品是正品呢?
最后,有没有可以砍价的余地?会不会老板看大伙是新手,故意抬高价呢?
这一切的一切似乎并不好处理,那怎么办?
很简单,找个专业的人帮你挑不就行了!
他会按照你的需求帮你挑选相机的类型与诸多参数,根据性价考虑可接受的报价,同时会检查相应参数与质量,另外还会跟老板适当的砍一砍价格,这一切的一切都不需要你来操心,那么你只需要做什么你?很简单,只要付款就行了!
从上面两个例子来看,面向对象这种编程的思想实际上就是要好好考虑要做的事情,然后找到一个对象命令其去完成
那么我们只需要做两件事:
找到对象
发出命令
那么现在都是找到现成的对象,就是按照要求找存在的对象去完成,那么要是不存在这样的对象怎么办呢?
很明显,就自己写个“对象”出来
好比一家软件公司,以前都是做WebForm开发,但是突然间讨论决定,要求向MVC方向发展,但是现在公司里没有人会怎么办?
第一、招聘人员,让专人去完成
这就好比根据需要找到相应的对象,直接找现成的对象
第二、挑选公司中优秀的人才出去学习,就是公司委培
这好比找不到合适的对象,就自己写一个
那么我们写程序使用对象是不需要考虑对象内部的实现,我们只要结果,但是如果由我们自己来写一个“对象”,其内部实现仍然需要考虑。而且实现的详细过程,仍然可以是面向对象的,也可以是面向过程的
对于简单的类,实现可以归结到面向过程中来,然后不断的套用,可以发现面向对象的编程思想只是一个处理问题的方式方法,其基础最后仍然是面向过程的!
总结一下,对象就是能够帮你完成一些任务的具体的东西
比如之前说到的“餐馆”、“摄影师”、“职工”等
不难发现它们都是具体的个体,实实在在的个体,是一个可以感觉、使用或接触的事物
但是餐馆有很多,摄影师也不是只有一位,职工那就更不用说了。不难发现以上说的都是一个群体中的一个具体的个体
那么我们程序的组织也是如此,我们可以有一个群体,叫做“类(class)”,群体是一个概念,泛指的内容
我们在程序中真正使用的就是该群体中的一个特有的个体,叫做“对象”,对象表示我们使用的具体事物
比如手机,HTC莫扎特也是手机,苹果iPhone4也是手机,而100元的诺基亚也是手机,它们都叫手机,但是都又不同
同样的,每一台iPhone4是不是都一样呢?或每一台HTC莫扎特都一样呢?
其实每一款机器型号虽然相同,但是一定会有一个唯一的编号
其实我们说的手机就是泛指,对于手机这个概念,品牌就是具体的,而对于品牌和型号,每一个实实在在的手机,大家拿在手上、揣在兜里的手机就是个体。我们就可以将这些泛指看做类,具体的手机看做对象。因为只有具体的手机才能完成打电话、或玩游戏的功能
那么在程序中就有了“类”这样的类型,对象作为该类的变量来使用
2、如何使用面向对象
说了这么多到底怎么去使用呢?
1、是直接使用.Net Framework提供的对象
其实之前已经使用的非常多了
对于输出:
Console.WriteLine();
Console.Write();
对于输入
Console.ReadLine();
Console.ReadKey()
这些都是Console类提供的方法(静态方法)
再比如产生随机数的方法,也是使用已经有的类
2、是自定义类,使用自己的对象
之前说过类只是为了实现面向对象的工具,同时类又是一种类型,因此要使用,先要定义类
定义类的语法是(仅考虑类本身):
[访问修饰符] class 类名
{
// 类的成员
}
这里成员是什么,后面会说到
定义类之后,需要使用,就好像一开始我们吃饭找餐馆一样,先要找到饭店,然后提出要求
在Main方法中,首先要创建一个该类型的对象出来,由于类也是类型,因此满足定义变量的语法
类名 变量名;
这样还没完,这里只是定义了一个“餐厅”,好比你知道有一个餐厅,但是不知道在哪儿一样
因此需要创建一个出来,创建的语法使用
new 类名();
这里创建一个对象又称为“类的实例化”,其创建的对象往往又称为“该类的实例”
不严格地说,对象就等同于实例(实际上这里也有泛指,因此严格意义上并不等同)
因此完整的应该写为:
类名 变量名 = new 类名();
或 类名 变量名;
变量名 = new 类名();
OK这里就是有关面向对象编程思想的一个简单描述,具体的类怎么写、有什么用,如何使用实例去完成任务,我们下回分解... ...