面向对象程序设计简单基础概述

面向对象程序设计简单基础概述

面向对象程序设计简单基础概述

E-BADBOY

 

本文只简单的介绍面向对象的一些基础的概念,让面向对象的初学朋友有一个简单的大致了解.

 

面向对象编程(Object-Oriented Programming ,OPP)是一套概念和想法,是一种利用计算机程序来描述实际问题的思路,也是一种直观,效率更高的解决问题的方法.

 

让我们先来了解面向对象的一些专有名词:

(Class)

名称空间(Namespace)

封装(Encapsulation)

继承(Inheritance)

多态性(Polymorphism)

抽象化(Abstraction)

 

面向对象的缘由

面向对象的缘由主要是为了解决2个问题:

1,程序代码的重复使用,由此种机制可以增加程序开发的速度.

2,降低维护负担,将具备独立性特制的程序代码包装起来,同时修改部分程序代码时,不至于会影响到程序的其他部分.

 

在过去, 为了增加程序代码的重复使用,程序员将重复出现的程序代码包装成一个个函数,在要使用到此函数时,在程序代码中调用此函数,以达到重复的目的.当有许多不 同的项目要使用到函数时,最简单的方式就是把这些函数独立成为一个文件。可独立成原始代码文件,或是采用外部的动态连接函数库(DLL),然后在每个项目 中引用这些共用函数,以达到共享的目的。但在这个阶段中达到共享代码的目的时却隐藏了一些问题:

共用函数库中包含的函数数以千计,要了解每个函数的用途和输入、输出参数相当困难。

共用函数库通常使用全局变量,在各函数之间互相传数据,了解全局变量与各函数之间的相依关系相当的繁杂。

共用函数库可能会分散在不同的电脑上,要在不同的电脑之间维护共用函数库的版本一致性也相当繁杂。

共用函数库版本更新时,可能会造成使用这些函数库的程序无法运行,造成维护上的困难。

我们该怎么解决呢? 这就牵涉出了类。

 

共用函数数以千计,比如说在C#中定义许多函数可以让你绘图,有些函数则用来存取文件,某些函数用来管理文件,不过问题是,谁有办法记得所有的函数用途呢?共用函数数以千计,为了让函数库能易于使用,便将这些函数分门别类。举例来说,针对文件操作的函数分为File一类,针对数据存取的函数分成DataSet一类,以便于程序员的查询和使用,这就是所谓的类。

那么类多了怎么好管理呢?这就牵涉出了名称空间。

名称空间

共用函数在分门别类后,在查询上比较容易,不过这又连带的衍生出一个问题:不同的分类中可能会包含相同的名称空间,这就是所谓的命名冲突问题。举例来说,一个软件里的A类用来计算加减,而你调用其他软件类时,它的A类却是用来计算乘除的,为了解决名称冲突的问题,就有了名称空间的概念。类似JAVA的Package,将类放到名称空间之下管理,若要使用某类时,将语法修改成 “名称空间.类名称”。如此,不同的名称空间之下就可以使用相同的函数名称和类了

 

过去的程序员为了达到重复使用代码的目的,而将这些函数独立成文件,可让其他程序员引用。不过使用函数库还有一个潜在的问题:全局变量(GlobalVariable) 难以维护。举例来说,有两个函数共用一个变量,因此将这个变量声明在全局变量的区段,但是共用函数库的其他函数,也看到了这个变量,但却从来都不会使用到 这个变量,因此,你必须为所有的全局变量做好良好的解释,详述有哪些函数使用到这个全局变量等。这些信息非常的不容易维护,而且也容易导致变量名称冲突错 误。

那么怎么解决全局变量这些问题呢?这就牵涉出了数据封装。

数据封装

数据封装就是用来解决全局变量不容易维护的问题。数据封装的意义是将这些函数按照其功能分门别类后,再把每一个分类的函数所共用数据包装起来,只有这个分类的函数才能调用这些数据。“实例的属性和行为的封闭,封装后的属性只能被对象名调用;封装后的属性只能被过程访问”(摘自《计算机操作系统教程 2版》)

 

之前提到的,为了让程序代码更容易的重复使用,过去采用的原始代码共用的方法,不过大部分只是停留在将别人已经写好的程序代码复制过来,在加上一些功能,如此,这只是共用程序代码而已,而不是重复使用别人已经写好的功能。

那么怎么样才能解决重复使用别人已经写好的功能呢?这就牵涉出了继承。

继承

继承的主要目的就是希望能够重复的使用别人写好的功能。指定一个类与另一个类之间的某种关系。你可以将一个类继承下来,然后就可以使用到里面编写的所有函数。举个例子来说,A类定义了一个方法X 而B类继承了A类,也就是继承了A类的方法,则建立了B类以后,就可以调用A类的X方法了。继承里的叫法还有很多,比如父类(A),子类(B)什么的,只是语异意同

 

继承别人类里已经编写好的功能原本是个不错的主意,但是或许你并不需要基础类的所有方法,比如刚才的A类里,除了X方法外还有Y、Z方法,但我只需要使用到X方法,不需要Y、Z方法,或有时基础类提供的方法不是我想要的时候。

这是该怎么办呢?这就牵涉出了多态性。

多态性

对于多态的解释有很多,我们可以大致理解为,为了加强继承的弹性,常常会需要变更某些继承下来的功能,但不改变函数,这就是所谓的多态性;再简单点定义就是说,“允许老代码调用新代码的能力”(摘自Tom Archer的《C#技术内幕》一语;另如多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作”(摘自Charlie Calverts的《Delphi4 编程技术内幕》)

 

虽然继承别人以写好的功能,使程序代码更容易重复使用,不过试想一下,若修改了基础类(Base Class)中函数的程序代码,继承基础类的扩展类是否还能正常的运做呢?如果基础类是自己开发的,要修改你的程序决不是什么问题,但若基础类是别人的比如微软的,那就不好说了。

这又该怎么办呢?这就牵涉出了抽象化。

抽象化

抽象化概念的生成是为了要降低程序版本更新后,在维护上面的负担。使得功能的提供者,和功能的用户能够分开,各自独立,彼此不受影响。

 

接口

为了达到抽象化的目的,需要在功能提供者与功能使用者之间提供一个共同的规范,功能提供者与功能使用者都要按照这个规范来提供、使用这些功能。这个共用的规范就是接口了,接口定义了功能数量、函数名称、函数参数、参数顺序等。它是一个能声明属性、索引器、事件和方法的编程构造。它不为这些成员实现,只提供定义。接口定义了功能提供者与功能使用者之间的准则,因此只要接口不变,功能提供者就可以任意更改实现的程序代码,而不影响到使用的人,当然除了不能实质上的变动。很多人都把继承和接口搞混淆了,其实举个例子想因该会明白,继承就好象自己做的内部开发的调用一样,如先前的A类B类X方法,而接口就好似两个以上的体系做的共同规范,如我们调用WINDOWS API一样.

 

仁者见仁 智者见智 作者技术有限 有什么不道之处 欢迎指出改正。

 

 

 注:转栽请注明出处.                                 E-BADBOY

                                                  www.HackK.Net

                                                     2003-1-5

 

                                                  

参考书籍:

Grant Palmers《C# 程序员参考手册》

Tom Archers《C#技术内幕》

Charlie CalvertssDelphi4 编程技术内幕》

青年出版社《C#技术平台实战演练》

清华大学《计算几操作系统教程 第2版》

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值