第二章:VB.NET面向对象——类、对象与名称空间,面向对象和类

<一> 面向对象和类

面向对象不仅仅是一种新的程序设计技术,而且是一种全新的设计和构造软件的思维方法。它使计算机解决问题的方式更加类似于人类的思维方式,更能直接地描述客观世界。从程序设计的角度看,面向对象代表了一种通过模仿人类的建立现实世界模型的方法(包括概括、分类、抽象、归纳等)进行软件开发的思想体系。

1.面向对象

一般认为面向对象的程序设计语言应具有4种特殊的对象化属性:抽象、封装、继承和多态。

1.1抽象数据类型

在面向对象程序设计中,程序由相关的一组对象(Object)组成,对象之间通过发送“消息”相互通信。从概念上讲,可以把一个实例,类型提供了对相似的对象进行分类并归纳这些对象的共同特征的一种手段。一个抽象数据类型是将类型及其有关的操作集合封闭在一起的一个数据类型。

抽象(Abstraction)是具体事物一般化的一种过程,即对具有特定属性及行为特征的对象进行概括,从中提炼出这一类对象的共性,并从通用性的角度描述共有的属性行为特征。抽象包括两个方面的内容:一是数据抽象,即描述某类对象的公共属性;一是代码抽象,即描述某类对象共有的行为特征。支持抽象数据类型的语言必须能够支持信息隐藏,也就是说,一个对象只能通过为这个抽象数据类型定义的接口进行访问和修改;用于实现这个抽象数据类型及共操作的内部实现细节、数据结构和存储表示,对方访问和处理这个对象的使用者是不可见的,这表明对象具有公共接口,以及这些接口的私有表示和实现。

抽象是面向对象程序设计中组织程序的主要原则。一个类型结构设计完善的程序可以减少并局部化类型之间的依赖,从而提高软件的可维护性。

1.2封装性

封装(Encapsulation)是一种信息隐藏技术,对象内部对使用者是隐蔽的,使用者只能见到对象封装界面上的信息。封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只要能用设计者提供的消息来访问该对象即可。

封装的概念与集成电路芯片类似。用陶瓷封装起来的一块集成电路芯片,共内部电路是不可见的,而且使用者也不必关心它的内部结构,只关心芯片引脚的电气参数及引脚提供的功能。利用这些引脚,使用者将各种不同的芯片连接起来,就能组装成具有一定功能的产品。

封装具有如下特征:

● 一个清楚的边界,所有对象的内部变化范围限制在这个边界内。

● 一个接口,用来描述对象本身与其他对象之间的相互作用。

● 受保护的内部实现,它给出了软件对象提供的功能细节,在外部不能访问这些细节。

面向对象的语言以对象协议或规格说明作为对象的外部界面。协议指明该对象所能接收的消息,在对象的内部,每个消息响应一个方法,方法实施对数据的操作。对数据方法的描述是协议的实现部分。

显式地把对象的定义和对象的实现分开是面向对象系统的一大特色。封装本身,即模块性,把定义模块和实现模块分开,从而使用面向对象技术所开发设计的软件的可维护性和可修改性大为善。

1.3消息和方法

在面向对象程序设计中,“对象”是系统中的运行实体。换句话说,对象是具有特殊属性(数据)和行为方式(方法)的实体,是将各种数据和对这些数据进行操作的函数约束在一起的一种语言结构。由于对象包含了数据和方法,因此就像微型的、独立的程序,这样就能把它们构造成程序块,建立更加复杂的对象,这类似于用晶体管元件来构造电路。

怎样要求对象完成指定的操作,对象间如何进行联系呢?所有这一切都只能通过传递消息来实现。消息用来请求对象执行某种操作或回答某些信息的要求;消息使数据流和控制流统一起来;某一对象在执行相应的处理时,如果需要,可以通过传递消息请求其他对象完成某些处理工作或回答某些信息;任何对象在执行所要求的操作时,都可以通过传递消息与其他对象联系。因此,程序的执行是靠在对象间传递消息来完成的。

可以把全部对象分成各种对象类,每个对象类都定义一组所谓的“方法”,实际上可以把它们看作是作用于该类对象上的各种操作。

综上所述,可以看出,面向对象的程序设计方法放弃了传统语言中控件结构的概念,以往的一切控制结构的功能都可通过对象及其相互传递消息来实现。

1.4类和层次

在面向对象的程序设计中,对象是程序的基本单位,与传统语言中变量和类型之间的关系一样,可以把相关的对象归并到一类中去。只要定义一个类就可以得到若干个实例(instance)对象。

具体来说,类由方法和数据组成,它是对象性质的描述,包括外部特性和内部实现两个方面。类通过描述消息模式及其相应的处理能力来定义对象的外部特性,通过描述内部状态的表现形式及固有处理能力的实现来定义对象内部实现。

一个类实际上定义的是一种对象类型,它描述了属于该类型的所有对象性质。例如,Integer是一个类,它描述了所有整数的性质,包括整数的算术运算及比较的实现。具体的整数,如“0”“2”“4”等都是类Integer的对象,类对它们具有算术运算和大小比较的处理能力。

对象是在执行过程中由其所属的类动态生成的,一个类可以生成多个不同的对象,而一个类的所有对象具有相同的性质,即其外部特性和内部实现都是相同的。一个对象的内部状态只能由共其自身来修改,任何别的对象都不能改变它。因此,同一个类的对象虽然在表现形式上相同,但这们可以有不同的内部状态,这些对象并不是完全一模一样的。一个类的上层可以有父类(或超类),下层可以有子类,形成一种层次结构。这种层次结构具有继承性,一个类继承其父类的描述。这种继承具有传递性,即如果类Class2继承Class1,而Class3继承Class2,则Class3继承Class1。其中Class2对Class1、Class3对Class2的继承叫做直接继承,而Class3对Class1的继承叫做间接继承。一个类实际上继承者了层次结构中在其上面的类的描述。因此,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上层种类所描述的性质。

综上所述,类是一组对象的抽象,它把这些对象所具有的共同特征(包括操作特征和存储特征)集中起来,由这些对象所共享。从系统构成的角度看,则形成了一个具有特定功能的模块和一种代码共享手段。

1.5继承性

继承(Inheritance)是一个类获取另一个类的性质过程。继承性是自动地共享类、子类和对象中中和数据的机制。每个对象都是某个类的实例,一个系统中类对象是各自封闭的。如果没有继承,则类对象中的数据和方法就可能出现大量重复。继承性是实现从可重用万分构造软件系统的最有效的特性,它不仅支持系统的可重用性,而且还能提高系统的可扩充性。

在类的层次结构中,一个类可以有多个子类,也可以有多个基类(即父类或超类)。因此,一个类可以直接继承多个子类,这种继承方式称为多重继承。如果一个类最多只能有一个类,这种继承方式称为简单继承或单重继承。在简单继承中,类的层次结构是树状结构,而多重继承是网状结构。

1.6多态性

多态性(Polymorphism)是一个名字可以具有多种语义。在面向对象的程序设计语言中,多态引用表示可以引用多个类的实例。假定类B是派生类D的基类,则在使用基类B的对象b的地方也可以使用派生类D的对象d,这意味着一个公共的消息集(即方法)可以送到类B和类D的对象上。当同样的消息可以被送到一个基类的对象和它派生类的对象上时,这就是多态性。多态性允许每个派生类对象以一种适合于它定义的方式来响应消息。

例如,假定有一个类层次,用执行收集数据的操作,它的基类可收集一个人的姓名、年龄、参加工作时间、住址、邮政编码等,其派生类可以根据职业的不同确定增加什么辅助信息,比如,管理人员可能要增加职务、所在部门等信息,而工人可能要增加工种,技术级别等信息。也就是说,基类收集所有派生类都需要的通用信息,而派生类收集与具体工作任务相关的附加信息。利用多态性,可以把收集公共数据的信息送往每个类,而基类和派生类以一种合适的方式响应这些信息。

2.类和对象

类是进行封装和数据隐藏工具。它把一组逻辑上相关的实体联系起来,并具备从外部显式地对这些实体进行访问的手段。因此,类是与程序有关的“资源”裸体的集成,它提供了组织逻辑上有关的数据、函数及数据对象的技巧,从而为编写大型的、复杂的应用程序提供所需要的资源。

在面向对象的程序设计中,“对象”是系统中的基本运行实体。Visual Basic.NET中的对象与面向对象程序设计中的对象在概念上是一样的,但在使用上有很大区别。在面向对象程序设计中,对象由程序员自己设计。而在Visual Basic.NET中,对象分为两类,一类是由系统设计好的,称为预定义对象,可以直接使用或对其进行操作;另一类由用户定义,可以像C++一样建立用户自己的对象。

如前所述,Visual Basic.net全面支持面向对象,是真正的面向对象的程序设计语言。在Visual Basic.net中,可以建立自己的类,可以方便地实现继承、多态、重载、接口等多种功能。

在Visula Basic.net中,对象是一组代码和数据的封装体,可以看作是一个整体处理单元。一个对象可以是应用程序的一部分,如控件和窗体,整个应用程序也可以是一个对象。窗体上的控件,如按钮、标签等都是对象。在一个项目中,每个窗体是一个独立的对象。一个数据库可以看作是一个对象,并含有其他对象,如字段和索引。

Visual Basic.net中的每个对象都是用类定义的。工具箱中的每个控件都量个类,在窗体上画出一个控件之前,以该控件命名的对象是不存在的。建立一个控件后,就是建立了该控件类的一个拷贝或实例,类的这个实例是在应用程序中引用的对象。在设计阶段所操作的窗体是一个类;在运行阶段,Visual Basic.NET建立窗体类的一个实例。

所有的对象都是作为它们的类的相同拷贝建立的。一旦它作为个别的对象存在,就可以改变它的属性。例如,假定在窗体上画了三个按钮,则每个按钮就是按钮类(Button)的一个实例,即该类的一个对象,每个对象共享一组由类定义的通用的特性和功能(属性、方法和事件)。

但是,每个对象有它自己的名字、可以打开和关闭、可以放到窗体的不同地方,等等。

为了简单起见,在一般情况下,都不指明对象的类,而是称“XX控件”。例如“列表框控件”,实际上指的是“列表框控件类的一个实例”或“列表框控件类的一个对象”。

预定义的对象提供了各种不同的功能,用户不用编写代码就可以使用这些功能。例如,可以建立政局的菜单和子菜单,但不必实际编写代码,而是通过由Visual Basic.net提供的菜单控件实现。