| « | September 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | |
| 公告 |
| 努力学习C#。 |
| Blog信息 |
|
blog名称:Areyan's Blog 日志总数:31 评论数量:10 留言数量:-2 访问次数:140342 建立时间:2005年1月5日 |

| |
|
[VB]面向对象在VB6语言中的应用 软件技术
阿严 发表于 2006/5/4 21:45:58 |
面向对象在VB6语言中的应用
来公司之前,没接触过VB,只知道和Delphi一样,是一个优秀的RAD开发工具,但和Delphi强大的面向对象能力不同的是,VB不支持面向对象的功能,属于传统的RAD开发工具。最初对VB的感觉就是这样的,肤浅而又片面,在公司使用VB的这段时间内,越来越发现当初对VB的认识有失偏颇,面向对象的几个重要特点,基本上都可以在VB6实现。这篇文章,一方面是对我自己当初对VB错误认识的一个纠正,加深自己对VB中面向对象功能的认识。更重要的一个原因是:希望这篇文章能起拋砖引玉的作用,使得部门同事之间在信息交流,技术共享方面做得更好。毕竟思想的分享具有传递和累加性,交流和探讨的过程,也是加深理解,纠正错误观点,清晰思路,提高自己的过程。好了,闲话少说,让我们进入正题!
一:面向对象(Object-Oriente)编程的基本概念
什么是面向对象编程呢?首先,面向对象编程与结构化编程相对而言,是结构化编程语言发展到一定阶段,无法解决软件规模越来越大而出现的软件危机,在其基础上形成的。结构化编程是一种编程方法,是用计算器的视角来抽象问题的方法,关注的是特定问题的具体业务流程,面向对象编程也是一种编程方法,它采用从更接近真实世界的视角来分析问题,使用更接近人们理解真实世界的方法来抽象问题,仿真真实世界的方法,这种方法称为“面向对象”(OO)。
面向对象的本质是对真实世界的抽象与仿真,把要解决的问题如业务逻辑抽象成一个个的业务模型,业务的流向和逻辑通过业务模型的交互来进行处理和分析。类与对象是面向对象编程中最基本的两个概念。类是对真实世界事物的仿真和抽象,在编程中可以认为是自己定义的数据结构,拥有自己的方法和数据成员,其中数据成员表示类对象的状态,而方法是改变类状态的操作。对象是类的具体实现。类是个概念,而对象是这个概念的实体。一个完全的面向对象的语言,至少要具备以下四个最基本的特征。
1:抽象 Abstract
2:封装 Encapsulation
3:继承 Inherited
4:多态 Polymorphism
1:抽象:抽象是对现实生活中相同类别事物的共有特征的高度概括。或许这样的解释比较枯燥,,也不容易理解。前面提到,面向对象是对现实生活事物的仿真和真实反映,那就以现实中的例子加以说明。想象一下鸟儿的形象,不用特定指哪一种鸟,只要是说到鸟这样概念,在脑海中基本上就会出现如下的一个形象:有翅膀,有羽毛,有两只脚,会飞,会唱歌的精灵。为什么说到鸟我们就自然想到是这样的,而不是一个头上有角,身躯庞大,有四只脚的牛的模样呢?这是因为有翅膀,有羽毛,有两只脚,会飞,会唱歌是现实世界中各种各样鸟的共同的特征,这样的共同特征就是对鸟最生动的抽象。
由此可见,抽象的目的是为了提取共性,明确数据成员,清晰功能和方法。
抽象是面向对象建模中最基本的要求,在实际的程序设计对特定领域的业务建模时,一个适合的抽象能对建模的成功起到事半功倍的效果。
2:封装。封装是隐藏内部实现细节,只向外公布特定的访问接口,减少操作的复杂性。封装的目的是为了信息隐藏。比如天天使用的显视器,有打开/关闭按钮,通过这个按钮,就可以实现打开和关闭显示屏的目的,对于使用者来说,需要的是通过这样的简单按钮就可以操作显示器,根本不需要关心显示屏的内部是如何通过这个按钮真正实现对显示屏的打开和关闭的工作。这是现实中的封装。面向对象中的封装主要的作用也在于些:隐藏实现细节,实现代码的安全性。
3:继承。继承的含义是父类拥有的特征和功能,子类可以自动拥有。继承的目的是为用代码重用,缩短编码时间,减少开发周期。世界万物中,存在着许多生动的现象来告诉我们什么是继承,比如说鸟的一种:百灵鸟,因为属于鸟这个类别,就自然拥有鸟儿有翅膀,有羽毛,可以飞翔,可以歌唱的本领。俗话中的“虎父无犬子”,“老鼠的儿子会打洞”等等,都是在用通俗但很精辟的语言阐述着什么是继承。
4:多态。多态是面向对象语言中最难理解的概念,事实上也是使用最广泛的一个特性。从字面意义来理解,多态就是一个对象具有多种形态。从程序实现上来看,多态是父类通过调用不同子类的相同方法,实现不同子类相同的操作,达到不同的效果,产生出不同的形态。还是以刚才的例子来说明吧,百灵是鸟的一种,黄鹂也是鸟的一种。它们都有由父亲继承下来的动作:歌唱。但百灵歌声清脆悦耳,黄鹂歌声婉转动人。同样的一个动作,不同的鸟儿会唱出不同的旋律,但我们都可以说是鸟儿在歌唱。这就是生活中的多态。正是存在着各种各样的多态,窗外的世界才会如此多姿多彩,耳边才时时响起醉人的燕语莺声。
二:VB6中的面向对象应用
初步了解了面向对象的基本概念后,现在我们来看看,VB6中面向对象三大特征的实现和应用。
1:封装
封装应该是VB6中用得最多的面向对象的概念。封装在面向对象语言中常表现为:属性,方法和事件。属性应该是VB中实现封装最多的一种,具体实现很简单,定义好一个私有变量,再定义好相应的Let 和 Get 属性 就可以实现榜上相应的属性。Get和Let分别对应着对这个属性的Read(读) 和 Write (写)
相关方法如下:
Private sSomeValue As String
Public Property Let SomeValue( Byval vData as string)
sSomeValue = vData
End Property
Public Property Get SomeValue() As String
SomeValue = sSomeValue
End Property
2: 继承
VB6中通过implentments关键词来实现继承。要注意的是,在VB中指定继承后,对于父类所公开的的属性和方法,必须要手动在子类中一个一个的实现。当然如果觉得手动编码不方便的话,也可以通过IDE中的ClassBuilder类生成器帮助也可以。
但有点奇怪的是,在VB6中,子类从父类那继承的,只能是接口,而不能继承父类中的实现。就算是接口,也要在前面加上父类的名称才可以正确编译。这样看来,VB6中的继承,实际上只能算得上的面向接口继承,而不能称为面向实现继承了。面向实现继承是可复用的基础,VB提供的只是接口继承,无法提供实现继承,再加上也不能实现重载(override)和过载(overload)的功能,这些可能是VB中面向对象无法得到广泛使用的原因之一吧
3:多态
相对于继承支持的不足, VB6对多态的实现是很成功。仔细思考后也就清楚了其中的原因,多态的实质是接口与实现分离,父类定义接口,子类实现接口。而VB中的继承恰恰实现的就是面向接口继承,所有的实现都必须在子类中完成。表现出的正是多态的特征。
由于VB6中无法实现面向实现继承,再加上访问修饰符只有Private和Public两种,没有针对继承的Protected。所以VB6应该不能称上是真正的面向对象语言。幸运的是,在DotNet环境下,VB.Net实现了以上的所有不足,成为一个真正的面向对象语言。
三:让我们看得更得更深入点
1:封装变化
封装的目的是实现信息隐藏,简化访问操作。但要明确的是,封装的对象是什么?或许大家都有过这样的开发体会,在开发过程中,有时需求的一点变更会引起多处程序的修改,严重时会因为一个小小的修改而导致好多意想不到的Bug。用户的需求可能千变万化,理想的情况当然是在系统分析中把所有的业务逻辑和情况都考虑到,但业务发展无法预见,再完美的系统设计也无法解决未知的业务发展变化。而程序开发参考的是现有的项目设计文文件和开发文档,所以业务的变更结果是程序修改无法避免。那么如何做到程序设计中在满足新的需求变化的同时,尽可能减少修改呢?现实中的封装或许可以帮助我们找到部分答案:显示器通过连接线与PC主机通讯,实现正常工作。以前使用的是15’显示器,然后发展成17’纯平,现在流行液晶了。但对于主机来说,不论显示器的类型如何变换,大小如何改变,形状如何变幻,但只要显示器提供的连接线结构不变,主机就不用做任何的改动,继续通过显示接口与显示器正常通讯。看,多么简单但又高效的设计,解决了人们对显示器要求的不断更新。在程序设计中,我们也可以学习这样的思想来解决不断出现的需求变化:封装变化,将存在变化的业务逻辑封装成一个或多个独立的类,提供相应的功能接口供外部程序使用。但业务规则发生改变时,只须修改封装这一业务逻辑的类,将修改所引起变更的范围压缩到最小。只要对外的接口函数没有改变,外部与这个类交互的代码就不用做任何修改,自然就不用担心程序中其它代码会因为这次的修改而产生更多的Bug。
2:状态维护
面向对象的封装的目的是为了信息隐藏,提供代码访问的安全性。
对于一个类来说,封装的结果对外表现为属性和方法。其中属性是类状态表现,而方法表现出来是类能实现的功能和操作。
类属性与全局变量是有区别的,在程序运行时,同一时间内,全局变量只能有一个值,程序中所有访问该全局变量的代码,得到的是相同一个值。属性不同,类在程序运行时必须要实例化成具体的对象才能工作,所有实例化的对象都有相同的属性,但每一个对象的属性值都可能不同。每一个不同的属性值都可以看成是同一个类同一属性不同状态的表现。
3:面向接口继承和面向实现继承
面向基类继承也就是面向实现继承,表现出的是子类自动拥有父类的特征,自然界的遗传特性基本上都可以看成是典型的面向基类继承。那么面向接口继承该怎么理解呢?我们可以把接口理解成是一系列概括性规范和标准,还没有做定具体的规则。不同的实现者可以按照自己的实际情况去填充和实现。
举个例子,一老汉,做了一个面饼,给了他的几个儿子,
阅读全文(1604) | 回复(0) | 编辑 | 精华 |
| | |
|