【转】对象

很想自己写一点东西,可是谁让咱是初学者了,写不出来挺自卑,可是又想想谁还不是从初学者一步一步走过来的呢(呵呵,典型啊Q精神),听人家说面向对象很重要,这几天看了很多文章,感觉这篇文章还不错,可还是没理解透,希望过路的高手给俺指点迷津,谢谢了先。



谈到面向对象,其实应该没什么好说的了。弹指十多年,这个东西已经不是什么新鲜概念而是事实上的开发标准了。不过对于大多数初学者,甚至是不在少数的一些 Coder 来讲 OO 还是一个概念而没有成为一种思想。  那么究竟怎么理解 OO 呢?

  首先你得搞明白 Object 的含义。所谓对象,在 Developer 眼里万物皆为对象。
  比如,我们从早上起床开始:
  睁开眼(Object)看见天(Object)亮了,那是因为有光(Object),抬头(Object)望望窗(Object)外,太阳(Object)出来了...
  我们能叫上名字的各种实体就是对象,而我们接触到的就是这些对象的实例(Instance)。所以面向对象首先就是面向我们能接触到的各个实例。但这样就有问题了,我要这样说:早上起床睁开对象看见对象亮了,那是因为有对象,抬对象望望对象外,对象出来了...不但我自己糊涂你还得骂我神经病,呵呵。
  因为我们接触到的各个对象实例有很大的不同,才有这五彩缤纷的世界。要是一眼望过去全是一模一样的“对象”,我会疯掉,相信你也会。所以我们会根据不同的实例来细分这些对象:
  睁开眼(Object:Eye)看见天(Object:Sky)亮了,那是光(Object:Light),抬头(Object:Head)望望窗(Object:Window)外,太阳(Object:Sun)出来了...
  是不是清楚多了?那么我们是怎么区分这些对象呢?天上有一个太阳一个月亮,我们从小就知道它们是不同的,甚至不需要理由。为什么?因为它们的外观形态活动规律都有极大的区别,这个就是它们各自独有的特征了。这些特征有些是可以用数值来描述的,例如肩高超过 38 厘米的属于大型犬(我们某些衙门一刀切政策的特征),这些是对象具有的状态;有些是根据其动作来判断的,例如会叫的狗不咬人(千万别信!),这些是对象具有的行为。我们区分所有的对象都是靠它们具有的状态和行为来识别,比如你看见一个对象,它有5吨重,3米高,四条粗腿,一条长鼻子,两只大白牙,即使你从没见过你也应该知道它是什么,因为它具有的这些特征我们至少从书本上见过。再比如我现在敲这段文字的时候,腿上一阵奇痒,不用看我就知道屋子里至少有一只蚊子而且还是位蚊子小姐,因为我已经知道在这种情况下只有母蚊子才具有“叮”这种行为。
  新的问题又来了。比如我们这个小区有不少养宠物的,每天傍晚狗跳猫蹿的煞是热闹。看上去狗都是狗猫都是猫,可是每只狗都有不同每只猫也都相异。原因是它们主要的状态和行为虽然都完全相同,却又都有各自独有的特性。所以我们还得继续细分,这就有了类(Class)。类的状态称为属性Property),而行为就是方法Method)了。
  我知道吉娃娃是狗,雪纳瑞也是狗,只不过两者看上去的差异实在是巨大。但它们都有犬类的主要属性和方法(别以为吉娃娃就不咬人,你试试看?呵呵),因此它们都属于犬科动物(Class Canine)。而且我还知道犬科动物属于哺乳动物(Class Mammalia),哺乳动物属于动物(Class Zoology),动物属于生物(Class Biology);生物呢?我不知道了(对不起中学生物老师了,呵呵),就直接归类到对象吧。OK,整理一下:
  Object——Biology——Zoology——Mammalia——Canine——Schnauzer
                                                                                               |——Chihuahua
  耶?很面熟吧。对了,忽略掉 Object 再把其他分支加上去就是生物分类树了。我不是生物学家但我知道一个生物学家要研究犬科动物他决定不会试图去找一只 Canine,因为压根儿就没有这种东东,他只能去研究Schnauzer、Chihuahua或者其他什么能找到的狗狗,因为我们只能接触到 Instance
  好了,到这里你应该有点想法了吧。等等,最重要的还没怎么说呢!初学者一接触 OO,通常就是被类搞得有点迷糊,很多教材上来就是一句“要理解面向对象首先要理解类!”,然后抓住 Class 一通猛灌,你酒量大点还行,否则难免被灌到晕菜。
  而我费了这么多口舌为什么还没有讲到什么是类?因为类这个东西本来就是抽象的,是对象具有的属性和方法的集合,你搞清楚了对象、实例、属性、方法,我就不信以你的智慧还不知道什么是类。
  接下来我们看看这些术语在软件开发中的定义:
  对象(Object——对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。——专业的解释是不是很艰涩?
  对象具有状态,一个对象用数据值来描述它的状态。——对象既然是实体,当然会有状态,比如说我现在的状态是:清醒,还有饿(先去找找有什么吃的吧)
  对象还有行为,用于改变对象的状态。——对象要么是活的,可以自己改变状态,比如我困了就会去睡,睡觉的时候状态就改变了(睡着了就不饿了~~55~居然没找到能填肚子的);要么是死的,可以被活的对象改变状态,比如要是我现在找到一包泡面,我担保它很快改变它的状态。
  对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。——我想着这篇文字,动手把它敲出来,动手得我自己来(我要是有秘书的话...那至少也得动嘴吧),知识也是我自己的(如果不是那就成盗版了)。
  类(Class)——具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。——有点拗口吧,你要是上来就看这个不去管 Object,不晕才怪。
  类具有属性(Property),它是对象的状态的抽象,用数据结构来描述类的属性。——想想生物学家靠什么分类生物的。
  类具有方法(Method),它是对象的行为的抽象,用方法名和实现该方法的操作来描述。——你被狗咬过没?没有?那你被蚊子咬过没?
  类具有事件(Event),它是对象的一个消息,告知对象有重要情况发生,事件还允许在不同任务之间进行通信。——被狗或蚊子咬的时候你会有什么感觉?没有?Kao!I 服了 U!
  不得不提到 消息(Message)
  对象之间进行通信的结构叫做消息。在对象的方法中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。——想想你打电话或发邮件的过程,我们研究对象和类最终的目的是为了传递消息。对我们来说,世上没有无意义的状态和行为,所有这些我们都理解为对对象认知的消息。
  搞清楚了对象和类。我们再来看看 OO 的特征:
  1. 对象唯一性
  每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。——你是你我就是我,到死都不会变成另一个人。整容?有本事你把 DNA 也整整。
  2. 分类性
  分类性是指将具有一致的数据结构(属性)和行为(方法)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。——您要是达尔文的话,想把 Jap 划到猪啊驴啊什么的分类估计至少是可以流传一段时间的。
  3. 继承性
  继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。——这个是OO 的重点了!想当年 Pre-VB6 的时代,因为伟大的 VB 居然不支持继承让多少 VB Developer 抬不起头来,现如今伟大的 .NET 终于可以让他们重振雄风了,呵呵。
  继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。
  在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。——比如...单细胞动物?非生物专业不敢乱讲。
  在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。——这个多了,最典型恐怕是骡子了。
  在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。——什么?你还在用头文件、包含文件和函数模块,你...去做底层开发吧。
  4. 多态性
  多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。——同一品种的狗不同的训练方法可以让它们在“咬”的时候有不同的“咬”法。
  多态性允许每个对象以适合自身的方式去响应共同的消息。
  多态性增强了软件的灵活性和可重用性。
  写到这儿天色已微明,肚子也在咕咕叫(卖早点的还不出来啊),其他的留待下回分解吧,呵呵。最后再来看看起床的过程:
  开(Eye.Open)眼(Object:Eye)看见(Event:I.See)天(Object:Sky)亮(Sky.Dawn)了,那是光(Object:Light),抬(Head.Up)头(Object:Head)望望(I.Look)窗(Object:Window)外,太阳(Object:Sun)出来(Sun.Sunup)了...
  这样是不是就清楚了?

转载于:https://www.cnblogs.com/yanfei331/archive/2007/06/20/790747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值