面向对象技术初步

大一学vb.Net的时候老师对面向对象技术只字不提,可能在很多人眼中面向对象是一种很抽象的技术,可是不理解面向对象就不可能掌握任何一种面向对象的编程语言,比如C++,c#,java.vb.net其实面向对象技术并没有人们想向的那么难以理解,只要熟练掌握面向对象技术的三种关键特性封装,继承,多态,那么面向对象的编程语言也就学会一半了。
本文就封装,继承,多态三种特性进行详细解说,首先介绍一下类与对象的概念。

   
结构化程序采用自顶而下的设计模式,所谓自顶而下就是把一个能够完成具体任务的程序划分成多个模块,每个模块完成一个特定的功能,模块由函数来实现。也就是说结构化程序语言的基本单位是函数。在大型软件的开发中使用函数会带来许多问题,比如全局变量会暴露程序的实现细节,这样就给程序的维护和 更新带来诸多不便。为了解决结构化程序的缺点面向对象程序语言提出了类的概念!

   
然而什么是类呢?类是对象的一种抽象,可是什么是对象呢?对象是对现实事物的一种抽象。在现实世界中,我们面对的是具体的实物,这些实物是看的见摸的着的,我们可用味觉触觉嗅觉等去认识具体的事物。然而在计算机程序世界处理器能够理解的仅是二进制码,因此我们不可能像描述现实世界的具体实物一样去描述计算机世界中的具体事物。因此有必要将现实世界中的具体实物抽象为计算机能够理解对象。为了便于管理和使用对象有必要将对象抽象为类!

   
纵观计算机编程语言的发展我们不难得出这样的一个结论:计算机编程语言的发展其实就是一次一次的抽象过程。以前使用机器语言的时候程序员编写程序必须用机算机能够识别的二进制码,也就是由01组成的数码,我们不难想象记住这些由01组成的指令是多么的困难,不仅如此程序员必须对处理器的工作原理了如指掌,后来出现了汇编语言,他引人了助记符的概念,这样一来程序员就可以不去记那么多难以记住的数字指令,汇编语言对软件产生贡献功不可没,然而使用汇编语言同样有很大的难度,因为程序员同样需要掌握具体处理器的工作方式。C语言的出现把程序员从冷冰冰的机器中解放出来,有很多书籍把操作系统称之为虚拟机,我们必须明白程序员编程就是告诉处理器怎样去工作,所谓虚拟机就是虚拟的计算机,他把计算机的硬件处理器屏蔽了,也就是说操作系统是处理器的抽象,这样一来处理器对程序员来说是透明的,我们可以直接对操作系统编程,只要处理器上运行了特定的操作系统,那么处理器就能够执行我们对该操作系统编写的程序。C语言就是这种运行在具体操作系统上的语言。计算机技术继续发展,接着就出现了Javac #,我们都知道这两种语言是独立于平台的,所谓独立与平台就是说这两种语言可以在不同的处理器和不同的操作系统上运行,不过前提条件是系统安装了这种语言运行的虚拟机,也就是说Java c#的虚拟机把操作系统抽象了,操作系统对程序员来说是透明的。

   
说了这么多就是让读者能够明白学习计算机就是陪养抽象思维的过程,要学会用计算机的思考问题的方式去思考。

   
明白了抽象的概念现在就用具体的例子来说明什么是类什么是对象。笔者曾经组装一台计算机用于学习编程,笔者的一个朋友也希望组装一台这种高性价比的机器,可是他对计算机硬件一窍不通,他甚至不知道计算机是由哪几部分组成的,于是就请笔者帮忙。这种情况笔者首先会问朋友购买计算机的预算和用处,得知朋友的具体需求以后我给他写了以下这个配置单:Intel 奔腾系列的处理器,Intel 3系列的主板芯片组,250G 的硬盘2G的内存,航嘉的电源,明基的光驱,三星的显示器。分析这个单子,笔者没有具体指明每一个散件,只是把具体的电脑根据具体情况作了一下抽象。这样为朋友购买提供了很大的空间,他可以购买Intel 奔腾系列的多种处理器,比如21805200等,而Intel 3系列的芯片组同样有很多选择,比如按品牌可分为一线二线或者通路。如此等等——如果用面向对象的技术去分析,我写的配置单其实就是一个类,配置单里的具体项目就是这个类的成员。朋友根据配置单组装的电脑就是创建的对象。

   
封装性是类的一个很重要的特性,封装隐藏了类的具体实现细节只对外界提供特定的接口。这里的接口指的是类的公有方法和公有成员变量。外界如果要使用某个类仅需要知道这个类能够实现的功能和这个类对外界提供的接口而不必关心这些功能是如何实现的。就好像我们在使用电脑的时候不必要知道处理器是如何存取指令的,操作系统是如何运行的,我们只要掌握计算机对外提供的接口也就是具体的软件的使用方法就行了。类的封装性降低了软件的偶合性,这对代码的重复使用提供了保障。

子承父业叫做继承,在面向对象的编程语言中继承和封装是相互矛盾的,封装强调隐藏类的实现细节,而继承会打破封装,继承的主要目的是实现多态和重写父类的方法,这样一来父类的某些实现细节就对子类暴露了。虽然继承不利于类与类之间的低偶合性但他却可以大弧度提高编程的效率。比如现在开发的一个项目需要对以前编写的类进行扩充,那么我们没必要重新去写这个类,只要继承这个类并且添加需要的方法就能实现对类的扩充,当一个类的子类比较多时,如果我们要修改所有子类的方法就没有必要去修改每个子类,只要修改一下父类所有的子类也就跟着修改了,这对软件的后期维护非常方便。还以买电脑的例子说明继承的特性。假如笔者的那个朋友想买第二台电脑用于玩游戏,但是笔者给他写的配置单中没有包括独立显卡,这样一来许多游戏就无法运行,朋友向笔者请求解决方案,这时笔者没必要重新写一个配置单,只要在以前写的配置单中加上这么一条:ATI显卡;新的配置单中继承了以前哪个配置单的内容并且根据需要添加了新的功能。这样一来笔者的朋友就可以拿着继承后的配置单去购买能玩大型游戏的电脑了。

   
多态是面向对象编程技术中最难理解的概念,我相信没有人能够正面回答多态是什么这个问题。若想真正理解多态必须通过编程实践,有些东西没有亲身体验永远都不会明白。这里仅介绍通过继承实现多态的机制,至于什么是多态笔者不正面回答由读者慢慢体会。

  
我们首先应该明白类有以下两种特性,其一子类可以继承父类的公有方法和公有成员变量;其二父类引用变量可以引用子类的对象。 那么请思考以下问题:如果用父类的引用变量引用了子类的对象,那么当用这个父类的引用调用父类和子类的公方法或成员变量时返回的是父类的成员还是子类的成员?

  
Java中返回的是子类的成员,在C#中也可以通过虚拟方法调用返回子类成员。这里得出了一个结论,父类所返回的成员是与其所引用的子类对象绑定的。当一个父类的引用变量引用不同的子类对象时将表现出不同的形态。现在举个例子帮助理解,比如说给张三一个苹果给李四一个梨子,我们同样也可以说给张三一个水果给李四一个水果,这里我们把把水果当作父类把苹果和梨子当作子类,父类可以代表许多子类,这就是多态。除了继承还可以通过接口实现多态,由于两者实现机制大同小异这里不在多说,读者可以参考有关书籍。

  
这篇文章主要描述了面向对象的基本概念,主要回答是什么,为什么而没有涉及怎么作。至于具体的实现过程将在下一篇《面向对象技术进阶:C#JAVA关键技术对比》进行讨论。

   虽然笔者尽最大努力避免错误,也查阅大量书籍求证,然而笔者才疏学浅,纰漏在所难免,希望读者原谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值