VBdotNET面向对象.doc_第1页
VBdotNET面向对象.doc_第2页
VBdotNET面向对象.doc_第3页
VBdotNET面向对象.doc_第4页
VBdotNET面向对象.doc_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 类、对象与名称空间 Visual Basic.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 B全面支持面向对象,是真正的面向对象的程序设计语言。在Visual B中,可以建立自己的类,可以方便地实现继承、多态、重载、接口等多种功能。 在Visula B中,对象是一组代码和数据的封装体,可以看作是一个整体处理单元。一个对象可以是应用程序的一部分,如控件和窗体,整个应用程序也可以是一个对象。窗体上的控件,如按钮、标签等都是对象。在一个项目中,每个窗体是一个独立的对象。一个数据库可以看作是一个对象,并含有其他对象,如字段和索引。 Visual B中的每个对象都是用类定义的。工具箱中的每个控件都量个类,在窗体上画出一个控件之前,以该控件命名的对象是不存在的。建立一个控件后,就是建立了该控件类的一个拷贝或实例,类的这个实例是在应用程序中引用的对象。在设计阶段所操作的窗体是一个类;在运行阶段,Visual Basic.NET建立窗体类的一个实例。 所有的对象都是作为它们的类的相同拷贝建立的。一旦它作为个别的对象存在,就可以改变它的属性。例如,假定在窗体上画了三个按钮,则每个按钮就是按钮类(Button)的一个实例,即该类的一个对象,每个对象共享一组由类定义的通用的特性和功能(属性、方法和事件)。 但是,每个对象有它自己的名字、可以打开和关闭、可以放到窗体的不同地方,等等。 为了简单起见,在一般情况下,都不指明对象的类,而是称“XX控件”。例如“列表框控件”,实际上指的是“列表框控件类的一个实例”或“列表框控件类的一个对象”。 预定义的对象提供了各种不同的功能,用户不用编写代码就可以使用这些功能。例如,可以建立政局的菜单和子菜单,但不必实际编写代码,而是通过由Visual B提供的菜单控件实现。 名称空间 名称空间(Namespaces)称得上是M中最重要的概念。所谓名称空间,就是让每一个名称都有自己的活动空间,不会互相混淆。名称空间类似于文件系统中目录与文件的关系,用来控制对象标识符的范围,组织对象库和层次结构,简化对象引用,并可防止在引用对象时出现二义性。有了名称空间,就可以方便地组织应用程序要使用的各个类。.NET、Visual Basic.NET或其他语言的代码都包含在名称空间中。 1. 什么是名称空间 Microsoft在.NET平台上提供了大量的基础类,这些类构成了.net的类库。在Visual B中,可以通过继承或调用方便地访问类库,开发种种应用程序。此外,用户也可以根据需要建立自己的类和类库。因此,在Visual B中,既有系统预定义的类和类库,也有用户自己编写的类和类库。 Visual Basic.NET预定义的类由.NET框架(.NET Framework)类库提供,而.NET框架类库由名称空间组成,每个名称空间含有可以在程序中使用的类、结构、枚举接口等。利用名称空间,可以有效地把预定义的类分为不同的类型,以便于管理和用户访问。也就是说,.NET类库提供了大量的类,通过名称空间把它们划分为不同的组。为了在自己的应用程序中使用系统提供的类、结构等资源,必须显式指定提供这些资源名称空间。 在Visual Basic.NET中。用户可以定义自己的名称空间,并可以访问由名称空间提供的资源。 根据作用域不同,名称空间分为两种,即局部名称和全局名称空间。在默认情况下,名称空间是局部可见的,即只对它所属的应用程序都局部的,因此,两个应用程序中的类可以同名,即使它们的名称空间同名,也不会发生冲突。这样,每个应用程序都可以有自己私有的一套名称空间和类。 与局部名称空间不同,全局名称空间对当前机器上的所有应用程序都是可见的。因此,对于那些要用于机器上所有应用程序的类,必须放在全局名称中。一般来说,全局名称空间不如局部名称安全,对它的要求比局部名称空间要严格一些,例如必须满足严格命名和版本控件要求,必须有数位标,必须在.NET运行期间注册等。之所以这样做,是为了确保不同应用程序中的名称空间和类的命名的唯一性,但增加了不少麻烦。在可能的情况下,最好使用较安全的局部名称空间。2. NET中的名称空间2.1 .NET名称空间的整体结构.NET提供的系统类库极为庞大,含有大量的名称空间,每个名称空间包括不同的类(Class)、结构(Structure)和接口(Interface)。大多数名称空间的顶层为System,并可根据功能在逻辑上划分为若干个子名称空间。如下图所示。SystemCodeDOMDrawingRuntimeCollectionsGlobalizationSecurityComponentModelServiceProcessIOConfigurationTextManagementCoreThreadingMessagingDataTimersNetDiagnosticsWebReflectionDirectoryServicesWinFormsResourcesXML.NET名称空间总体结构 从图中可以看出,类库的最顶层是System,这是所有类的根名称空间,其余都是它的子名称空间。 System名称空间及其子名称空间所提供的对象是编写应用程序的基础,可用来编写Viual C+.NET、C#.NET、Viual Basic.NET等应用程序。但是,即使是较为复杂的大型应用程序,也只能用到.NET所提供的名称空间中的小部分功能。 在用Visula Basic.NET进行程序设计时,常用的名称空间有以下几种:(1)System:含有大多数基本的和经常使用的类,例如Object类(被所有其他对象继承)及各种基本数据类型等。(2)System.Refecton:由一些类和接口组成,它提供了加载类型、方法和域的控件视图,用来动态地建立和引用类型。(3)System.IO:文件管理及其输入/输出等。(4)System.Collection:数组、表(lists)、链表(Linked list)、图(maps)及其他数据结构。(5)System.Web:该名称空间含有与浏览器/服务器通信的类和接口,用于ASP.NET的网页功能。它提供了以下类和对象。 HTTPRequest类:有关当前HTTP请求的信息。 HTTPResponse类:控件HTTM对客户的输出。 HTTPServerUtility对象:访问服务器方的实用程序和方法。 除了上述类和对象外,System.Web名称空间还提供了有关Cookie管理、文件传输、异常信息以及输出高速缓存控件的类。(6)System.NET:提供了当前网络上多种协议的简单程序设计接口。(7)System.Windows.Forms:提供了建立基于Windows的应用程序的类,具有可以在Microsoft Windows操作系统中使用的大量的接口功能。在该名称空间中,含有Form以及各种控件的类,用这些类可以建立用户界面。3. 名称空间的使用3.1 项目引用 名称空间被集成到.NET环境中,如果不使用名称空间,则无法建立.NET应用程序。而为了在一个应用程序(项目)中使用名称空间,则必须建立该应用程序的项目引用。 项目引用出现在解决方案资源管理器窗口中的“引用”条目中。新建一个项目后,Visual B根据所建立的项目类型自动导入部分名称空间的引用。名称空间作为组文件存放在Visual Basic.NET中,组文件指的.dll、.ocx、.exe、.tlb、.olb等,每个组件可以含有一个或多个名称空间。3.2 直接定位 直接定位类似于文件系统中的完整路径。只要给出名称空间的命名,就可以访问其中的任一个类。例如,为了通过控制台输入/输出流(stdio)读写,可以使用System.Console名称空间中的WriteLine方法: System.Console.WriteLine(“This is a text”) 该语句中的WriteLine是System.Console名称空间中的方法,它可以在“输出”窗口中输出一行文件。 这种方法适用于应用程序中的所有名称空间。3.3 使用Imports语句 直接定位法可以准确地指定一个名称空间,但需要键入内容较多。为了减少键盘输入量,提高代码可读性,可以使用Imports,隐含地指定要使用的名称空间,应用程序可以使用由该关键字指定的名称空间中的类。Imports语句的格式如下: Imports aliasname= namespace 其中aliasname(别名)是可选项,代表已知的或可能引用的名称空间。当Imports语句不含有aliasname参数时,在模块内不加限定即可访问由指定的名称空间定义的成员;而如果指定了aliasname参数,则必须通过别名空间中所包含的名字。当需要使用一个或者多个名称空间中具有相同名字的项目时,别名是很有用的。 每个模块可以含有任意数量的Imports语句,一个模块中的Imports语句必须出现在对模块内标识符的所有引用之前。 由Imports语句获得的成员作用域取决于在使用Imports语句时如何指定。例如如果只指定了名称空间,则该空间中所有独立命名的成员不用限定即可使用;而如果既指定了名称空间又指定名称空间成员,则只能使用成员的一部分。 这里要注意,项目引用和Imports语句是有区别的,不要混为一谈。项目引用可以使外部对象(例如组件中的对象)用于Visual Basic.NET项目;而Imports语句用于简化对项目引用的访问,但并不提供对这些对象的访问。 Imports语句通常放在代码模块的顶部,用来指定程序中要使用的名称空间。有了这个语句后,每次使用这个名称空间中的类时,就不必显式地给出该名称空间,从而可以减少键盘输入量。 但是,如果两个名称空间中有同名的类,而且程序中要引入这两个名称空间,则当使用这个类时,必须显式地指定完整的空间名。否则会产生二义性。例如,假定有如下两个名称空间: MyMfgApp.Inventory MyMfgApp.Sales这两个名称空间中均含有Product类,则下面的代码将产生错误: MyMfgApp.Inventory MyMfgApp.Sales Public Sub DoSomthing () Dim obj As New Product () 定义Product类的一个对象 Edn Sub在这种情况下,编译器无法确定该引用哪个Product。如果将代码修改为: Dim Obj As New Sales.Product ()则可消除由Product引起的二义性。 在实际应用中,可能会经常遇到两个或几个名称空间有同名的类的情况,需要键入名称空间的全名,因而无法减少键盘输入量。如果给名称空间定义一个别名,则可使这种情况有所改善。 定义了一个名称空间的别名后,可以用这个别名对名称空间的成员进行限定。例如: Imports ConCh=Microsoft.VisualBasic.ControlChars为名称空间Microsoft.VisualBasic.ControlChars定义了一个别名ConCh,这样就可以用ConCh限定该名称空间的成员: Dim S As String S=”AAAAA”& ConCh.CrLf & “BBBBB可以看出,使用别名后,不但能避免二义性,而且可以减少键盘输入量。二、对象和类 Visual Basic.NET中有各种对象,包括窗体、控件等,这些对象是由Visual Basic.NET系统提供的,称为预定义对象。它们由系统建立,用户可以直接使用,但不能进行修改。当用Visual B建立应用程序时,就是在使用对象进行操作。 预定义对象和类 对象是一组代码和数据的封装体,可以看作是一个整体处理单元。一个对象可以是应用程序的一部分,如控件和窗体,整个应用程序也可以是一个对象。窗体上的控件,如按钮、图片框等都是对象。在一个项目中,每个窗体是一个独立的对象。一个数据库可以看作是一个对象,并含有其它对象,如字段和索引。 Visual Basic.NET中的每个对象都是用类定义的。工具箱中的每个控件都是一个类,在窗体上画出一个控件之前,以该控件命名的对象是不存在的。建立一个控件后,就是建立了该控件类的一个拷贝或实例,类的这个实例是在应用程序中引用的对象。在设计阶段所操作的窗体是一个类;在运行阶段,Visual Basic.NET建立窗体类的一个实例。 在Visual Basic.NET应用程序中,属性窗口显示了对象的类和名称属性。例如,在窗体上画一个按钮控件Button1,它是控件类Button的一个实例,即对象,此时可以在属性窗口中显示该对象的类和名称。 所有对象都是作为它们的类的相同拷贝建立的。一旦它作为个别的对象存在,就可以改变它的属性。例如,假定在窗体上画三个按钮,则每个按钮就是按钮类(Button)的一个实例,即该类的一个对象,每个对象共享一组由类定义的通用的特性和功能(属性、方法和事件)但是,每个对象有它自己的名字、可以打开和关闭、可以放到窗体的不同地方,等等。 为了简单起见,在一般情况下,都不指明对象的类,而是称为“XX控件”。例如,用户可以建立自己的打开文件和保存文件对话框,但不必实际编写代码,而是通过由Visual B提供的通用对话框控件OpenFileDialog和SaveFileDialog实现。 对象的操作 每个对象都有自己的属性、事件和方法。事件是由对象识别的操作,如单击鼠标或按一个键,可以通过程序代码响应一个事件。 一个对象的特性可以通过它的属性来设置。例如,音量是收音机的一个特性,在Visual Basic.NET中,可以说收音机有“音量”属性,通过改变它的值可以对这个属性进行调整: Radio.Volume=5 除属性外,对象还有方法。和属性一样,方法也是对象一部分,它是要执行的操作。例如,拨号打电话,可以说电话具有“拨号”方法,并可以用这个方法拨打8位号码66553322。1用属性控制对象 每个属性随时设置或取得的值而变化,有些属性可以在设计阶段设置,即通过属性窗口设置这些属性的值,不需要编写程序代码。而有些属性不能在设计阶段设置,必须编写代码以在运行时设置这些属性。 在运行时可以设置和获取的属性称为读写(Read-Write)属性,而在运行时只能读的属性称为只读(Read-only)属性,只读属性只能在设计阶段设置,在运行期间不能改变。 设置属性值是为了改变对象的外观和特性。例如,为了改变广西框的显示内容,只要设置文本框控件的Text属性即可实现。属性设置的一般格式如下: 对象.属性=表达式例如: TextBox1.Visaul=true TextBox.Text=”Love”有时候,可能需要获取指定对象的一个属性值,格式如下: 变量=对象.属性例如: B=TextBox1.Visual也可以作为较复杂的表达式的一部分获取属性值,而不是把属性值赋给一个变量。例如: Button1.Width+=2在该例中,按钮控件的Width属性是根据原来的属性计算出来的,即加上20。2用方法执行操作 方法通常在代码中使用,其格式由方法所需要的参数、方法是否返回值来决定。当方法不返回值时,格式如下: 对象.方法(参数表列)例如: PictureBox1.Refresh ()用Refresh方法重画图片框。访方法没有参数,也不返回值。有的方法需要参数,例如: ListBox1.Items.Add (“放飞”)如果方法需要的参数多于一个,则各参数要用逗号隔开。3对一个对象执行多个操作 有时候需要对一个对象执行几个不同的操作。例如,可能要对同一个对象设置几个属性,这可以通过多个语句来实现: Button1.Text=”OK” Button1.Visual=True Button1.Top=20 Button1.Left=50 Button1.Enable=True在该例中,所有属性都是对同一个对象Button1设置的。如果使用WithEnd With语句,则可使上述代码更容易写、更容易读,而且效率更高: With Button1 .Text=”OK” .Visual=True .Top=20 .Left=50 .Enable=True End WithWith语句可以嵌套。4对象的默认属性 许多对象都有默认属性,用默认属性可以简化代码,因为当设置其属性时,不必给出属性的名字。在Visual Basic 6.0中,控件一般有默认属性,在Viual Basic.NET中取消了控件的默认属性。但是,在建立自己的类时,可以定义默认属性。 对象的变量 变量可用来存储值(字符串、数值、日期等),也可以用来存储对象。存放数值的变量称为数值变量,存放字符串的变量称为字符串变量,而存放对象的变量称为对象变量。1对象变量的声明和赋值 和普通变量一样,为了使用对象变量,必须先声明,然后把一个对象赋给声明的对象变量。1.1 声明对象变量 对象变量的声明与普通的声明基本相同,格式如下: Dim|Private|Public 变量名 As New 类名 这里的Dim、Private或Public的含义与普通变量声明中的含义相同,“变量名”是所声明的对象变量的名字,“类名”是所声明的变量的类,可以是预定义的类,也可以是用户自己定义的类,New关键字用来指明所声明的对象变量是Visual Basic.NET对象一个新的实例。 例如,可以声明一个与窗体有关的对象变量,在应用程序中该窗体的名称为FrmMain: Dim FrmVar As FrmMain 声明一个类型为FrmMain的对象变量 也可以声明能在应用程序中引用任何窗体的对象变量: Dim anyForm As Form 通用窗体变量 类似地,也可以声明在应用程序中能引用任何文本框的对象变量: Dim anyText As TextBox 可以引用任何文本 也可以声明能引用任何类型控件的对象变量: Dim anyControl As Control 通用控件变量1.2 对象变量的赋值 对象变量的赋值与普通变量的赋值没有什么区别。例如,假定声明了如下一个对象变量: Dim Abutton As Control 而窗体有一个名为Button1的按钮,则可以用下面的语句: Abutton=Button1 把按钮Button1赋给对象变量Abutton,此后如果执行: Abutton.Text=”Ok” 则可把按钮Button1的Text属性设置为“OK”。 和普通变量一样,在把一个对象赋给一个对象变量后,如果再把另一个对象赋给该对象变量,则新的对象将取代变量中原来的对象。1.3 专用对象类型和通用对象类型 从前面的例子可以看出,对象变量既可以声明“通用”类型,也可以声明为“专用”类型。例如: Dim NewForm As Form 声明为通用类型窗体对象变量 Dim NewForm1 As Form1 () 声明为专用类型窗体对象变量 Dim NewT As TextBox 声明为专用类型控件对象变量 Dim NewC As Control 声明为通用类型控件对象变量 对象变量必须引用一个特定对象类型或类。一个专用窗体变量只能引用应用程序中的一个窗体;类似地,一个专用控件变量只能引用程序中的一个特定的控件类型,如TextBox或ListBox。例如,在窗体上画一个按钮和一个文本框,然后编写如下事件过程: Private Sub Button1_Clikc (ByVal sender As System.Object,ByVal e As System.EvenArgs) Handles Button1.Click Dim anyText As TextBox anyText=TextBox1 anyText.Text=”Love” End Sub 运行程序,单击按钮,将在文本框内显示“Love” 通用对象变量可以引用多个专用对象类型中的一个。一个通用窗体变量可以引用应用程序中的任何窗体;一个通用控件变量可以引用应用程序中任何窗体上的任何控件。例如,在窗体上画一个文本框、一个标签和一个按钮,顺序任意,然后编写如下事件过程: Private Sub Button1_Clikc (ByVal sender As System.Object,ByVal e As System.EvenArgs) Handles Button1.Click Static n As Integer=0 Dim anyControl As Control anyControl=Controls(n) anyControl.Text=”Love” n+=1 End Sub 运行程序,单击几次按钮,将依次把各控件的标题设置为“Love”。注意,第一个放到窗体上的控件顺序号(TabIndex属性)为0,第二个为1。当n的值大于最大顺序号时,程序出错。 Visual Basic.NET提供了3个通用对象类型,如下:(1)Form:应用程序中的任何窗体(包括MDI子窗体和MDI窗体)(2)Control:应用程序中的任何控件。(3)Object:任何对象。 当在运行期间不知道专用对象类型引用的变量时,通用对象变量是很有用的。例如,如果想编写在应用程序的任何窗体上都能操作代码,则必须使用通用的窗体变量。具体说明如下:(1)可以用Object数据类型来声明变量。例如,在窗体上画一个按钮和一个文本框,然后编写如下事件过程: Private Sub Button1_Clikc (ByVal sender As System.Object,ByVal e As System.EvenArgs) Handles Button2.Click Dim x As Object TextBox1.Text=”Love” X=TextBox1 If TypeOf x Is TextBox Then TextBox1.Text=”Yes” End if End Sub 上面程序中使用了TypeOfIs运算符,用来确定存储在对象变量中的对象类型。 运行上面的程序,单击按钮,将在文本框中显示“Yes”。用Object类型声明对象变量,“通过”性较强,但会降低程序的运行速度,也不便于调试。(2)当把同一个对象赋给两个对象变量时,如果改变了一个变量的属性,另一个变量的属性也要改变,程序可能会产生无法预料的结果,因此应避免出现这种情况。用关键字Is可以测试两个对象变量是否指向了同一个对象。假定声明了两个对象变量AControl和BControl,则用下面的代码: If Acontrol Is Bcontrol Then可以测试它们是否指向了同一个对象。2实例2.1 关键字New New关键字引入New子句,该子句建立一个新的对象实例。New子句必须指定一个可以用来建立实例的已定义的类。可耻下场以在声明语句或赋值语句中使用New。执行该语句时,它将调用指定类的构造函数,并传送所提供的参数。 New关键字可以用于窗体对象。在设计阶段建立的每个窗体都是一个类,可以用New关键字建立类的新的实例。为了看清这是如何操作的,可在窗体上画一个按钮和其他几个控件,然后编写如下的事件过程: Privage Sub Button2_Click (Byval sender As System.Object,Byval e As System.EventArgs) Handles Button2.Click Dim x As New Form1() x.Show End sub 运行程序,并单击几次按钮。由于窗体是具有可视界面的类,因此可以看到增加的拷贝。每个窗体都有相同的控件,和设计阶段的控件在同一个位置。 也可以在赋值语句中使用New关键字。在按钮事件过程试验下面代码: Privage Sub Button2_Click (Byval sender As System.Object,Byval e As System.EventArgs) Handles Button2.Click Dim x As Form1x=New Form1() x.Show End sub 在Visual Basic.NET中,数组也是类,因此可以用New建立新的数组实例: Dim MyArray As Integer () MyArray=New Integer () 0,1,2,32.2 派生 从前面的例子可以看出,当用New关键字声明一个新窗体时,将建立一、原窗体的一个实例,这个实例继承了原窗体的属性。通常把原窗体称为“原型”或“父辈”,把由原窗体派生的窗体称为“后裔”。如果程序中有一系列从同一父辈派生出来的窗体,则这些窗体将共享包含在原型窗体各种事件中的命令,并继承原型窗体的所有属性、控件和用Dim或Static声明的所有变量,使这些变量永久化,其作用域也扩展到整个窗体范围。但对每个后裔窗体,其属性、控件及永久变量都可以单独改变,因为每个后裔窗体实际上都拥有这些窗体的一份拷贝,它们并非共享,而只是继承。如果想使用所有窗体共享相同的数据,则必须用Public建立全局变量,而用Dim或Static只能建立局部变量,不能建立全局变量。 窗体的派生有可能导致“层叠”现象。所谓层叠,实际上是一种无限循环,即无限重复同一种操作。2.3 对象变量的释放 定义对象变量后,要为其分配适当的内在。和普通变量不同,对象变量需要的空间较大,如果不及时释放它所占用的内存,可能会影响程序的运行。 有时候,对象变量所占用的内存可以自动释放。例如,当含有某个对象的最后一个对象变量离开作用域时,将自动释放该对象所占用的内存,因此不必显式地释放对象变量。但是,这是一种不好的程序设计习惯。一般来说,如果在一个过程中声明了一个对象变量,则应在退出该过程之前显式地释放它所占用的内存。 对象变量的释放通过Set语句和Nothing关键字来实现,其格式为: 对象变量名=Nothing 例如: Dim MyStr As String Dim MyObject As New TextBox() Dim YourObject As New TextBox() MyObject=YourObject YourObject.Text=”Love” MyStr=MyObject.Text MyObject=Nothing 释放对象 当几个对象变量引用同一个对象时,为了释放该对象占用的内在及与对象有关的系统资源,必须把所有对象变量都设置为Nothing。3绑定 绑定(Binding)也称联编。一个源程序经过编译、连接生成可执行文件,是把可执行代码装配或绑定在一起的过程。其中程序运行之前就能完成绑定的称为静态绑定,又叫前期绑定或早期联编;而在程序运行时才完成绑定的叫做动态绑定也乐滞后联编。一般来说,前期绑定具有执行速度方面的优势(在执行之前可以对代码进行优化),而后期绑定具有更大的灵活性。在Visual Basic.NET中,当与对象交互时,可以对前期绑定和后期绑定进行访问。3.1 前期绑定和后期绑定 前期绑定表示代码直接与对象交互,即事先知道它的数据类型,可以直接调用对象的方法,因此能高效地与对象交互。前期绑定允许IDE使用“智能感知”(IntelliSence)辅助开发,使编译器确保引用现有的方法,提供正确的参数值。 后期绑定表示代码运行期间与对象进行动态交互,这提供了很大灵活性,因为代码不考虑与之交互的对象的类型,只要该对象支持可调用方法即可。由于IDE或编译器不知道对像的类型,因此不会使用IDE的“智能感知”,也不会在编译时进行语法检查,从而可以得到非常大的灵活性。 在默认情况下,所有的对象都是前期绑定。只要把Option Strict设置为On(默认),IDE和编译器就强制对象为前期绑定。但是,如果在源文件的开头把Option Strict设置为Off,就可以在该文件的所有代码中访问后期绑定。 当编译不能确定所谓的对象类型时,将会发生后期绑定,这种模糊性是由于使用Object数据类型产生的。Object类型的变量可以虚拟地保存任何值,包括对任何对象类型的引用。 后期绑定十分灵活,便也很容易出错,执行速度也比前期绑定代码慢。为了调用后期绑定的方法,Visual Basic.NET必须动态地确定目标对象是否有一个与要调用的方法相匹配的方法,然后再调用该方法,这就需要比前期绑定花费更多的时间。在前期绑定中,编译器事先就知道这样一个方法,因此可以编译代码,直接调用方法。3.2 CType函数 无论是否使用后期绑定,都可以用Object类型传递对象引用,在需要与对象交互时,把它转换为适当的类型,这可以通过CType函数来实现。该函数可以把一个表达式显式地转换为指定数据类型、对象、结构、类或接口。格式如下: CType (表达式,类型) 其中“表达式”是任何有效的表达式。如果“表达式”的值超出了“类型”所允许的范围,将会出现错误。“类型”是任何数据类型、对象、结构、类或接口的名称。例如: Dim MyNumber As Long Dim MyNewType As Single MyNumber=1000 MyNewType=CType(MyNumber,Single) MyNewType变量的值为1000.0 使用CType函数,可以对Object类型的变量执行前期绑定的方法调用。例如: Public Sub DoWork (ByVal obj As Object) Dim local As TheClass Local=CType(obj,TheClass) Local.DoSome () End Sub 在上面的代码中,声明了一个local变量,其类型为TheClass类。虽然所接收的参数是Object类型,也可以用Ctype函数获取对象的前期绑定引用。实际上,所有使用CType函数的方法调用都是前期绑定。类的定义 类是进行封装和数据隐藏的工具。它把一组逻辑上相关的实体联系起来。并具备从外部显式地对这些实体进行访问的手段。因此,类是与程序有关的“资源“实体的集成,它提供了组织逻辑上有关的数据、方法及数据对象的技巧,从而为编写大型的、复杂的程序提供所需要的资源。和过程一样,类也是Visual Basic.NET中结构化程序设计的手段。但是,过程是将逻辑上有关的语句和数据集合在一起,主要用于执行;而类则是逻辑上有关的方法及其数据的集合,它主要不是用于执行,而是提供所需要的资源。类中的过程对用户是隐蔽的,而且受到保护,用户只能使用,不能修改。1Class语句定义类 使用Class语句,可以定义自己的类,并可在类中定义所需要的数据、属性、事件和方法。格式如下 : Public | Private | Protected | Friend | Protected Friend Shadows Shadows MustInherit | NotInheritableClass类名 Inherits 基类名 Implements接口名 语句End Class Class语句大体上可以分为两部分,即选项部分和主体部分。其中主体部分以Class开头,以End Class结束,称为Class块,在Class和End Class之间的部分构成了类的主体。选项部分位于Class的前面,这些选项可以分为两类,即访问修饰符和继承控制。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论