VisualC#07-1面向对象和类_第1页
VisualC#07-1面向对象和类_第2页
VisualC#07-1面向对象和类_第3页
VisualC#07-1面向对象和类_第4页
VisualC#07-1面向对象和类_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、VisualC#07-1面向对象和类第7章 面向对象和类本章要点面向对象程序设计的概念掌握命名空间的意义掌握类的声明方法掌握构造器和析构器掌握方法,私有方法,共有方法的声明掌握域、属性、索引等概念VisualC#07-1面向对象和类第7章 面向对象和类7.1 7.1 面向对象编程概述面向对象编程概述.1结构化程序设计结构化程序设计 结构化程序设计是为了解决早期计算机程序的难于阅读结构化程序设计是为了解决早期计算机程序的难于阅读、理解和调试,难于维护和扩充,以及开发周期长、不易、理解和调试,难于维护和扩充,以及开发周期长、不易控制程序的质量等问题而提出来的,它的产生和发展奠定控制

2、程序的质量等问题而提出来的,它的产生和发展奠定了软件工程的基础。了软件工程的基础。 结构化程序设计的基本思想是:自顶向下,逐步求精,结构化程序设计的基本思想是:自顶向下,逐步求精,将整个程序结构划分成若干个功能相对独立的模块,模块将整个程序结构划分成若干个功能相对独立的模块,模块之间的联系尽可能简单;每个模块用之间的联系尽可能简单;每个模块用顺序、选择、循环三顺序、选择、循环三种基本结构来实现种基本结构来实现;每个模块只有一个入口和一个出口每个模块只有一个入口和一个出口。 VisualC#07-1面向对象和类第7章 面向对象和类7.1.1 7.1.1 结构化程序设计结构化程序设计 结构化程序设

3、计的优点:结构化程序设计的优点:(1 1)各模块可以分别编程,使程序易于阅读、理解、调各模块可以分别编程,使程序易于阅读、理解、调试和修改;试和修改;(2 2)方便新功能模块的扩充;)方便新功能模块的扩充;(3 3)功能独立的模块可以组成子程序库,有利于实现软)功能独立的模块可以组成子程序库,有利于实现软件复用等。件复用等。 由于这些优点,结构化程序设计方法出现以后,很快被由于这些优点,结构化程序设计方法出现以后,很快被人们接受并得到广泛应用。人们接受并得到广泛应用。VisualC#07-1面向对象和类第7章 面向对象和类7.1.1结构化程序设计 结构程序设计的问题:结构化程序设计方法以解决问

4、题的过程作为出发点,其方法是面向过程的。它把程序定义为: “数据结构+算法”程序中数据与处理这些数据的算法(过程)是分离的。这样,对不同的数据结构作相同的处理,或对相同的数据结构作不同的处理,都要使用不同的模块,降低了程序的可降低了程序的可维护性和可复用性维护性和可复用性。同时,由于这种分离,导致了数据可能被多个模块使用和修改,难于保证数据的安全性和一致难于保证数据的安全性和一致性性。VisualC#07-1面向对象和类第7章 面向对象和类7.1.1结构化程序设计 对于小型程序和中等复杂程度的程序来说,结构化程序设计是一种较为有效的技术,但对于复杂的、大规模的软件的开发来说,它就不尽如人意了。

5、 可以看出:结构化程序设计的核心思想是功能的分解,特点是将数据结构与过程分离,着重点在过程。用这种方用这种方法开发的软件可维护性和可复用性差。法开发的软件可维护性和可复用性差。 VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计面向对象的程序设计(Object-Oriented Programming)是一种基于结构分析的基于结构分析的、以数据为中心数据为中心的程序设计方法。它的主要思想是: 将数据及处理这些数据的操作都封装(Encapsulation)到一个称为类(Class)的数据结构中。使用这个类时,只需要定义一个类的变量即可

6、,这个变量叫做对象(Object)。通过调用对象的数据成员完成对类的使用。在该方法下,编程人员不需要过分关注“如何做”,而重点关注“做什么”。 VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计结构化程序设计方法与面向对象程序设计的区别:(1)结构化程序设计方法是面向过程的结构化方法,程序 设计从算法入手,然后是数据结构。(2)面向对象程序设计(OOP)首先考虑的是程序处理的数 据结构,即对象。VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计 在面向对象程序设计中:(1

7、)对象是构成软件系统的基本单元;(2)从同类型的对象中抽象出一种新型的数据类型,即类, 对象只是类的实例;(3)类的成员中不仅包含有描述类对象属性的数据,还 包含有对这些数据进行处理的程序代码(这些程序 代码被称为对象的行为或操作)。VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计 在面向对象程序设计中:(1)对象是构成软件系统的基本单元;(2)从同类型的对象中抽象出一种新型的数据类型,即类, 对象只是类的实例;(3)类的成员中不仅包含有描述类对象属性的数据,还 包含有对这些数据进行处理的程序代码(这些程序 代码被称为对象的行为或

8、操作)。VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计何为封装? 将对象的属性和行为放在一起作为一个整体的方法。封 装将对象的大部分行为的实现隐蔽起来,仅通过一个可 控的接口与外界交互。类的派生: 面向对象程序设计提供了类的继承性,可通过对一个被 称为基类的类增添不同的特性来派生出多种被称为派生 类的特殊类,使得类与类之间建立了层次结构关系,为 软件复用提供了有效的途径。VisualC#07-1面向对象和类第7章 面向对象和类7.1.2 7.1.2 面向对象程序设计面向对象程序设计面向对象程序设计的基本思想: 数据的分解,即着重

9、点放在被操作的数据上而不是实现 操作的过程上。它把数据及其操作作为一个整体对待, 数据本身不能被外部过程直接存取。思想的特点是: 程序一般由类的定义和类的使用两部分组成,主程序中 定义各个对象并规定它们之间传递消息的规律,程序中 的一切操作都通过向对象发送消息来实现,对象接收到 消息后,调用有关对象的行为来完成相应的操作。优点: 用这种方法开发的软件可维护性和可复用性高。VisualC#07-1面向对象和类第7章 面向对象和类7.1.3 7.1.3 类和对象概述类和对象概述在面向对象程序设计方法中,类是对自然现象或实体的程序语言描述,对象是对类的实例化。例如:类: 类可以泛指某一批外形、价格、

10、生产厂家、出厂日期完 全一致的笔;对象: 用这个类声明的一个对象是这些笔中一支实实在在的笔。 而且单纯从这一支笔中可以得到这样的常识:它具有一定 的属性(外形、价格、颜色、长短)、具有一定的行为 (写字、绘画),和“笔”这个类具有相同的属性和行为。VisualC#07-1面向对象和类第7章 面向对象和类7.1.3 7.1.3 类和对象概述类和对象概述 例如,笔是类,钢笔、铅笔、毛笔可以是笔的子类,例如,笔是类,钢笔、铅笔、毛笔可以是笔的子类,2B2B铅笔可以是铅笔的子类。张红买了铅笔可以是铅笔的子类。张红买了1 1支支2B2B铅笔,假设该铅笔叫铅笔,假设该铅笔叫APENAPEN,则,则APEN

11、APEN就是类(就是类(2B2B铅笔类)的实例,称为对象,它可铅笔类)的实例,称为对象,它可以有颜色、价格、长度、形状等属性。以有颜色、价格、长度、形状等属性。VisualC#07-1面向对象和类第7章 面向对象和类面向对象程序设计的主要特性有:面向对象程序设计的主要特性有:(1 1)封装)封装 封装就是把相关的数据和代码结合成一个有机的整体,形成数据和操作代码的封装体,对外只提供一个可以控制的接口,内部大部分的实现细节对外隐蔽,达到对数据访问权的合理控制。 封装使程序中个部分之间的相互联系达到最小,提高了程序的安全性,简化了程序代码的编写工作,是面向对象程序设计的重要原则 VisualC#0

12、7-1面向对象和类第7章 面向对象和类(2 2)继承(代码重用)继承(代码重用) 在面向对象程序设计中,继承表达的是对象类之间的关系,这种关系使得一类对象可以继承另一类对象的属性(数据)和行为(操作),从而,提供了通过现有的类创建新类的方法,也提高了软件复用的程度。 VisualC#07-1面向对象和类第7章 面向对象和类(3 3)多态)多态多态是指不同的对象受到相同的消息时产生不同的操作行为,或者说同一个消息可以根据发送消息的对象的不同而采用多种不同的操作行为。多态性是面向对象程序设计的重要特性之一,例如: 当用鼠标单击不同的对象时,各对象就会根据自己的理解作出不同的动作,产生不同的结果,这

13、就是多态性。简单地说,多态性就是一个接口,多种方式。 C+语言支持两种多态性,即编译时的多态性和运行时的多态性。编译时的多态性是用函数的重载来实现的,运行时的多态性是用虚函数来实现的。VisualC#07-1面向对象和类第7章 面向对象和类(4 4)重载)重载(overloading)(overloading) 允许使用具有相同的方法名称的多个方法允许使用具有相同的方法名称的多个方法. .区分方法的途区分方法的途径是方法具有不同的参数列表。如求立方的方法:径是方法具有不同的参数列表。如求立方的方法: int Cube(int number);int Cube(int number); floa

14、t Cube(float number); float Cube(float number); double Cube(double number); double Cube(double number);VisualC#07-1面向对象和类第7章 面向对象和类7.2 命名空间 在许多高级语言中,为了使编译系统内核尽量小,常常把每次编译中肯定要用到的部分放入编译内核,而将其他部分生成独立的单元放入到外围,用户在使用时,通过特定的命令将其调入。例如: C和C+语言中,系统将许多函数和预定义预存到一些称为头文件的文本文件中,用户在使用时,通过#include的命令就可以把这一部分调入并和源程序一起

15、编译。VisualC#07-1面向对象和类第7章 面向对象和类7.2 命名空间 在C#中,系统提供了命名空间来组织程序。在.NET编程环境中,命名空间是一个很重要的概念,它提供了一个逻辑上的层次结构体系。 命名空间既可以作为程序的内部组织系统,又可以作为程序的外部组织系统。当作为外部组织系统时,命名空间中的元素可以为其他程序所用。VisualC#07-1面向对象和类第7章 面向对象和类7.2.1 7.2.1 命名空间的声明命名空间的声明 命名空间的声明方法为:命名空间的声明方法为: namespace namespace 命名空间名命名空间名 命名空间定义体命名空间定义体 ;命名空间前面不需要

16、有任何修饰符,命名空间声明的最后命名空间前面不需要有任何修饰符,命名空间声明的最后一个分号可以省略。一个分号可以省略。VisualC#07-1面向对象和类第7章 面向对象和类7.2.1 7.2.1 命名空间的声明命名空间的声明 一个C#程序可以包含一个或多个编译单元,每个编译单元包含在一个独立的源文件中(编译单元就是能够被编译的最小单位)。 当C#程序被编译时,编译器会对程序的所有编译单元进行统一处理 。在一个编译单元中命名空间名的声明必须惟一,不能出现同名命名空间,否则系统会出现编译错误。 另外,虽然编译单元可能会相互依赖,但编译单元使用的命名空间调用语句只对本单元的属性和命名空间成员声明产

17、生影响,不会影响到其他的编译单元中。VisualC#07-1面向对象和类形式形式1 1: namespace NameSpaceOutsidenamespace NameSpaceOutside / /命名空间命名空间NameSpaceOutsideNameSpaceOutside的定义体部分的定义体部分 namespace NameSpaceInsidenamespace NameSpaceInside / /命名空间命名空间NameSpaceInsideNameSpaceInside的定义体部分的定义体部分 形式形式2 2: namespace SpaceInsidenamespace S

18、paceInside / /命名空间命名空间NameSpaceInsideNameSpaceInside的定义体部分的定义体部分 命名空间中的各个成员,如果没有另外声明,默认的访问修饰符命名空间中的各个成员,如果没有另外声明,默认的访问修饰符是是publicpublic,在其他命名空间中可以直接访问。命名空间声明时可,在其他命名空间中可以直接访问。命名空间声明时可以嵌套。例如:以嵌套。例如:VisualC#07-1面向对象和类 如果在一个命名空间中使用其他已定义好的命名空间,只需要在这个命名空间使用using语句便可对其他命名空间进行引用。例如:Namespace MyNameSpaceNam

19、espace MyNameSpace using System using System; using NameSpaceOutsideusing NameSpaceOutside; /命名空间的其他定义部分命名空间的其他定义部分 在该例中,命名空间在该例中,命名空间MyNameSpaceMyNameSpace在定义体中引用了在定义体中引用了系统命名空间系统命名空间SystemSystem和此前定义的命名空间和此前定义的命名空间NameSpaceOutside。注意,在一个命名空间体内,如。注意,在一个命名空间体内,如果要引用其他命名空间,应该在声明其他任何类型之前果要引用其他命名空间,应该在

20、声明其他任何类型之前引用。在该例中,如果把两行引用。在该例中,如果把两行using命令放置到命令放置到“命名空命名空间的其他定义部分间的其他定义部分”之后就会出现编译错误。之后就会出现编译错误。VisualC#07-1面向对象和类 如果多个命名空间具有相同的完整合法名称,那么这几如果多个命名空间具有相同的完整合法名称,那么这几个命名空间属于一个命名空间。个命名空间属于一个命名空间。namespace NameSpacenamespace NameSpace class A class A namespace NameSpacenamespace NameSpace class B class

21、B 该例中,两个命名空间声明具有相同该例中,两个命名空间声明具有相同的完整合法名的完整合法名NameSpaceNameSpace,所以它们所以它们属于同一个命名空间。此后对命名空属于同一个命名空间。此后对命名空间间NameSpaceNameSpace中的类访问时,只需要中的类访问时,只需要直接使用直接使用NameSpace.ANameSpace.A或或NameSpace.BNameSpace.B即可。即可。VisualC#07-1面向对象和类第7章 面向对象和类7.2.2 7.2.2 命名空间的成员命名空间的成员 在一个命名空间中可以包含多个成员声明,这些声明共同组成了这个命名空间的成员。命名

22、空间的成员类型多种多样,可以是一个类、结构、接口、枚举、委托等结构,也可以是另一个命名空间。无论是哪一种,命名空间成员类型声明都分别和各自类型声明要求一致。 VisualC#07-1面向对象和类第7章 面向对象和类7.2.2 7.2.2 命名空间的成员命名空间的成员 类型声明可以出现在编译单元的第一行中作为顶层声明,类型声明可以出现在编译单元的第一行中作为顶层声明,也可以出现在命名空间、类或结构的内部作为成员声明。如也可以出现在命名空间、类或结构的内部作为成员声明。如果类型声明以顶层声明出现,新声明的类型作为一个独立于果类型声明以顶层声明出现,新声明的类型作为一个独立于其他编译单元的类型,此时

23、,这个类型的名字本身就是它的其他编译单元的类型,此时,这个类型的名字本身就是它的完整合法名称。完整合法名称。 如果一个类型声明在一个命名空间、类或结构内部,那么如果一个类型声明在一个命名空间、类或结构内部,那么此类型就以它所在的命名空间、类或结构的成员身份出现,此类型就以它所在的命名空间、类或结构的成员身份出现,它的完整合法名应该与所在命名空间、类或结构关联起来表它的完整合法名应该与所在命名空间、类或结构关联起来表示,中间以示,中间以“.”.”隔开。例如:用隔开。例如:用S S代表要声明的类型,代表要声明的类型,N N代表代表命名空间、类或结构。如果命名空间、类或结构。如果S S是顶层声明,则

24、是顶层声明,则S S的完整合法名的完整合法名就是简单的类型就是简单的类型S S,如果类型,如果类型S S声明在声明在N N内部,则内部,则S S的完整合法的完整合法名就是名就是N.SN.S VisualC#07-1面向对象和类第7章 面向对象和类7.2.2 7.2.2 命名空间的成员命名空间的成员 对类型声明的访问权限与该类型声明所处的位置有关: (1)在编译单元或者命名空间中声明的类型,可以具有公有(public)或内部(internal)两种访问权限。默认的访问权限是内部。 (2)在类中声明的类型,访问权限可以是公有(public)、保护(protected)、内部(internal)、私

25、有(private),默认的访问方式是私有。 (3)在结构中声明的类型,访问权限可以是公有(public)、保护(protected)、私有(private),默认的访问方式是私有。VisualC#07-1面向对象和类第7章 面向对象和类7.2.3 7.2.3 命名空间的使用命名空间的使用 在C#中,命名空间的调用是通过using指令实现的。using指令有两种用途:一种是别名使用指令,可以定义一个命名空间或类型的别名;另一种是命名空间使用指令,可以引入一个命名空间的类型成员。 using指令的有效范围是指该指令所属的编译单元或命名空间。VisualC#07-1面向对象和类第7章 面向对象和类

26、7.2.3 7.2.3 命名空间的使用命名空间的使用(1)别名使用指令 与C或C+中的#define命令类似,C#中可以使用别名使用指令为命名空间或类型定义别名,此后的程序就可以使用这个别名来代替定义的这个命名空间或类型。别名使用指令的格式为: using 别名=命名空间名或类型名;利用别名使用指令可以避免使用冗长的命名空间,例如下面利用别名使用指令可以避免使用冗长的命名空间,例如下面代码:代码:using LastMessage=MyProgram.MessageManagement.AllMessage.NextMessage;using LastMessage=MyProgram.Mes

27、sageManagement.AllMessage.NextMessage;VisualC#07-1面向对象和类再看下面的例子:再看下面的例子:namespacSpace2namespacSpace2 class A class A namespace NameSpace3namespace NameSpace3 using Space2.A using Space2.A; class B:Rclass B:R namespacSpace2namespacSpace2 class A class A namespace NameSpace3namespace NameSpace3 using

28、Space2 using Space2; class B:R.Aclass B:R.A VisualC#07-1面向对象和类利用别名使用指令所定义的别名的有效范围是该指令所属利用别名使用指令所定义的别名的有效范围是该指令所属的编译单元或命名空间,因此这里的别名在该编译单元或的编译单元或命名空间,因此这里的别名在该编译单元或命名空间中应该是惟一的,不能与其它成员同名,否则就命名空间中应该是惟一的,不能与其它成员同名,否则就会出错。例如:会出错。例如:namespace NameSpace1namespace NameSpace1 namespace NameSpace2namespace Nam

29、eSpace2 class ClassA class ClassA namespace NameSpace2namespace NameSpace2 using ClassA=NameSpace1 using ClassA=NameSpace1; 这里的三个命名空间中,后两个命名空这里的三个命名空间中,后两个命名空间名一样,是同一个命名空间。这两个间名一样,是同一个命名空间。这两个命名空间中,前一个声明了一个类命名空间中,前一个声明了一个类ClassAClassA,后一个引用了一个别名使用指,后一个引用了一个别名使用指示示ClassAClassA。二者虽然类型不同,但由于。二者虽然类型不同,但

30、由于这两个成员同名,所以出错。这两个成员同名,所以出错。VisualC#07-1面向对象和类在使用别名时,如果别名所定义的命名空间或命名空间中在使用别名时,如果别名所定义的命名空间或命名空间中的成员不存在,同样会出现错误。例如:的成员不存在,同样会出现错误。例如:namespace NameSpace1namespace NameSpace1 class ClassA class ClassA namespace NameSpace2namespace NameSpace2 using R=NameSpace1.ClassA; using R=NameSpace1.ClassA; class

31、ClassB: R.ClassA class ClassB: R.ClassA VisualC#07-1面向对象和类与一般成员一样,别名使用指令定义的别名在整个命名空与一般成员一样,别名使用指令定义的别名在整个命名空间或整个编译单元内都有效,该命名空间内其他成员都可间或整个编译单元内都有效,该命名空间内其他成员都可直接使用。例如:直接使用。例如:using R=NameSpace1; /using R=NameSpace1; /假设此前已定义假设此前已定义NameSpace1NameSpace1,并且有一个成员是类,并且有一个成员是类A Anamespace NameSpace2namespa

32、ce NameSpace2 class ClassB:R.A class ClassB:R.A namespace NameSpace3namespace NameSpace3 class ClassC:R.A class ClassC:R.A VisualC#07-1面向对象和类当在一个编译单元中同时声明多个别名时,别名的声明顺序没有关系,并且每个别名的声明不会受到自身或别的别名的影响。例如:namespacSpace2namespacSpace2 namespace NameSpace3namespace NameSpace3 using r1=NameSpace1; using r1=N

33、ameSpace1; using r2=Space2; using r2=Space2; using r3=r1.NameSpace2; using r3=r1.NameSpace2; VisualC#07-1面向对象和类第7章 面向对象和类7.2.3 7.2.3 命名空间的使用命名空间的使用(2 2)命名空间使用指令)命名空间使用指令 命名空间使用指令可以将一个命名空间的类型整个导入到另一个编命名空间使用指令可以将一个命名空间的类型整个导入到另一个编译单元或命名空间中,并且对这些类型的使用不需要使用完整合法名称,译单元或命名空间中,并且对这些类型的使用不需要使用完整合法名称,直接引用类型名称

34、即可。命名空间使用指令的格式为:直接引用类型名称即可。命名空间使用指令的格式为: using using 命名空间名;命名空间名;命名空间名应该是由系统提供的或用户已定义的命名空间名。和别名不同的命名空间名应该是由系统提供的或用户已定义的命名空间名。和别名不同的是:在包含命名空间的编译单元或命名空间定义体内部,别名在成员声明时是:在包含命名空间的编译单元或命名空间定义体内部,别名在成员声明时需要引用别名的成员,而命名空间可以直接使用已定义的命名空间的类型,需要引用别名的成员,而命名空间可以直接使用已定义的命名空间的类型,不需要指出命名空间名。不需要指出命名空间名。VisualC#07-1面向对

35、象和类例如对于大家比较熟悉的系统预定义的命名空间例如对于大家比较熟悉的系统预定义的命名空间SystemSystem,引用该命名空间后,可以直接使用其中的成员。引用该命名空间后,可以直接使用其中的成员。using System;using System;class Testclass Test static void Main() static void Main() Console.WriteLIne(“Hello,World!”); Console.WriteLIne(“Hello,World!”); VisualC#07-1面向对象和类对于用户自己定义的命名空间,先定义用户自己的命名空对于

36、用户自己定义的命名空间,先定义用户自己的命名空间后也可以直接使用,例如:间后也可以直接使用,例如:namespacSpace2namespacSpace2 class ClassA class ClassA / /命名空间命名空间Space2Space2的类的类ClassAClassA定义体定义体 namespace NameSpace3namespace NameSpace3 usinSpace2; usinSpace2; class ClassB:ClassA class ClassB:ClassA VisualC#07-1面向对象和类注意:命名空间使用指令只能导入命名空间本身,而不会注意

37、:命名空间使用指令只能导入命名空间本身,而不会导入嵌套的命名空间,例如:导入嵌套的命名空间,例如:namespacSpace2namespacSpace2 class ClassA class ClassA / /命名空间命名空间Space2Space2的类的类ClassAClassA定义体定义体 namespace NameSpace3namespace NameSpace3 using NameSpace1; using NameSpace1; class ClassB:NameSpace2.ClassA / class ClassB:NameSpace2.ClassA /出错出错 Vis

38、ualC#07-1面向对象和类如果在编译单元或命名空间中定义的成员名与命名空间名如果在编译单元或命名空间中定义的成员名与命名空间名相同,编译器将按成员名优先的原则。例如:相同,编译器将按成员名优先的原则。例如:namespace NameSpace1namespace NameSpace1 class ClassA class ClassA class ClassB class ClassB namespace NameSpace2namespace NameSpace2 using NameSpace1; using NameSpace1; class ClassB class ClassB

39、 命名空间命名空间NameSpace2NameSpace2中使用了命名空间使用中使用了命名空间使用指令,但由于编译器在编译过程中,按在同指令,但由于编译器在编译过程中,按在同一编译单元或命名空间中成员优先的原则,一编译单元或命名空间中成员优先的原则,所以命名空间所以命名空间NameSpace2NameSpace2中的中的ClassBClassB表示的表示的是是NameSpace2.ClassBNameSpace2.ClassB,而不是,而不是NameSpace1.ClassBNameSpace1.ClassB。 NameSpace1.ClassBNameSpace1.ClassB是指命名空间是

40、指命名空间NameSpace1NameSpace1中的那个类中的那个类ClassBClassB。VisualC#07-1面向对象和类如果在编译单元或命名空间中有多个命名空间使用指令使用,如果在编译单元或命名空间中有多个命名空间使用指令使用,而这些命名空间中又包含了相同的类型名,用户定义和使用而这些命名空间中又包含了相同的类型名,用户定义和使用时要注意,不要引起二义性。例如:时要注意,不要引起二义性。例如:namespace NameSpace1namespace NameSpace1 class ClassA class ClassA namespace NameSpace2namespace

41、 NameSpace2 class ClassA class ClassA namespace NameSpace3namespace NameSpace3 using NameSpace1; using NameSpace1; using NameSpace2; using NameSpace2; class ClassB:ClassA / class ClassB:ClassA /出错出错 VisualC#07-1面向对象和类为避免上述错误的发生,在使用过程中,应该在程序中直接为避免上述错误的发生,在使用过程中,应该在程序中直接指明使用的是哪一个成员。例如:指明使用的是哪一个成员。例如:n

42、amespace NameSpace1namespace NameSpace1 class ClassA class ClassA namespace NameSpace2namespace NameSpace2 class ClassA class ClassA namespace NameSpace3namespace NameSpace3 using NameSpace1; using NameSpace1; using NameSpace2; using NameSpace2; using R=NameSpace2.ClassA; using R=NameSpace2.ClassA;

43、class ClassB:R class ClassB:R VisualC#07-1面向对象和类第7章 面向对象和类7.2.4 7.2.4 命名空间的举例命名空间的举例 每个类或类库都定义在包含该库中所有类的命名空间中。可以以命每个类或类库都定义在包含该库中所有类的命名空间中。可以以命名空间为单位,将类封装到给其它程序重用的动态链接库中,程序可以名空间为单位,将类封装到给其它程序重用的动态链接库中,程序可以在执行时载入动态链接库来访问在很多程序间共享的公用功能。一个动在执行时载入动态链接库来访问在很多程序间共享的公用功能。一个动态链接库代表一个程序集。项目使用类库时,该项目必须包含对定义类态链

44、接库代表一个程序集。项目使用类库时,该项目必须包含对定义类库的程序集的引用。下面看一下如何将类装载到动态链接库中以及如何库的程序集的引用。下面看一下如何将类装载到动态链接库中以及如何调用。调用。 先编写如下程序代码:先编写如下程序代码:VisualC#07-1面向对象和类VisualC#07-1面向对象和类VisualC#07-1面向对象和类VisualC#07-1面向对象和类VisualC#07-1面向对象和类 下面创建一个类下面创建一个类AssemblyTestAssemblyTest,在该类中引用程序集,在该类中引用程序集TimeLibrary.dllTimeLibrary.dll,并显

45、示标准和通用的时间字符串格式:,并显示标准和通用的时间字符串格式:程序运行结果为:程序运行结果为:Standard time: 1:27:06PMStandard time: 1:27:06PMUniversal time:13:27:06Universal time:13:27:06VisualC#07-1面向对象和类第7章 面向对象和类注意点:注意点: 命名空间使用指令在一定程度上能减少同一编译单元命名空间使用指令在一定程度上能减少同一编译单元内或命名空间的程序代码量,增加可读性。但如果使用过内或命名空间的程序代码量,增加可读性。但如果使用过多,反而会使程序关系复杂,减弱可读性,增加出错的

46、可多,反而会使程序关系复杂,减弱可读性,增加出错的可能。因此在使用时,特别是使用用户自己定义的别名使用能。因此在使用时,特别是使用用户自己定义的别名使用指令或命名空间使用指令时,应尽可能指明其隶属关系。指令或命名空间使用指令时,应尽可能指明其隶属关系。VisualC#07-1面向对象和类第7章 面向对象和类7.3 声明自己的类 在面向对象的程序设计中,在面向对象的程序设计中,静态的基本单位是类,动态的基静态的基本单位是类,动态的基本单位是对象本单位是对象,向对象发送消息可以激活对象的行为,所以面向,向对象发送消息可以激活对象的行为,所以面向对象的程序可以描述为:对象对象的程序可以描述为:对象+

47、 +消息传递。消息传递。7.3.1 7.3.1 类的声明类的声明 类的声明格式为:类的声明格式为: 类修饰符类修饰符class class 类名类名:基类类名基类类名 类的成员;类的成员; C# C#支持的类修饰符有:支持的类修饰符有:newnew、publicpublic、protectedprotected、internalinternal、privateprivate、abstractabstract和和sealedsealed,其含义为:,其含义为:VisualC#07-1面向对象和类 new new:新建类,表明由基类中继承而来的、与基类中同名的成员。:新建类,表明由基类中继承而来的

48、、与基类中同名的成员。 publicpublic:公有类,表示外界可以不受限制地访问。:公有类,表示外界可以不受限制地访问。 protectedprotected:保护类,表示可以访问该类或从该类派生的类型。:保护类,表示可以访问该类或从该类派生的类型。 internalinternal:内部类,仅能访问本程序。:内部类,仅能访问本程序。 privateprivate:私有类,只有该类才能访问。:私有类,只有该类才能访问。 abstractabstract:抽象类,是一个不完整的类,只有声明而没有具体的实现。:抽象类,是一个不完整的类,只有声明而没有具体的实现。一般只能用来做其它类的基类,而不

49、能单独使用。一般只能用来做其它类的基类,而不能单独使用。 sealedsealed:密封类,不能作其它类的基类,不能再派生新的类。:密封类,不能作其它类的基类,不能再派生新的类。 使用以上类修饰符应注意以下几点:使用以上类修饰符应注意以下几点: (1 1)在一个类声明中,同一类修饰符不能出现多次;)在一个类声明中,同一类修饰符不能出现多次; (2 2)newnew类修饰符仅允许在嵌套类中表示类声明时使用,表明类中类修饰符仅允许在嵌套类中表示类声明时使用,表明类中隐藏了由基类中继承而来的、与基类中同名的成员。隐藏了由基类中继承而来的、与基类中同名的成员。 (3 3)在使用)在使用publicpu

50、blic、protectedprotected、internalinternal和和privateprivate修饰符时,它修饰符时,它们不仅表示所定义类的访问特性,而且还表明类中成员声明时的访问特们不仅表示所定义类的访问特性,而且还表明类中成员声明时的访问特性,并且它们的可用性也会对派生类造成影响。性,并且它们的可用性也会对派生类造成影响。VisualC#07-1面向对象和类 (4 4)抽象类修饰符)抽象类修饰符abstractabstract和密封类修饰符和密封类修饰符sealedsealed都是受限类修都是受限类修饰符。抽象类修饰符只能作其它类的基类,不能直接使用。密封类修饰饰符。抽象类

51、修饰符只能作其它类的基类,不能直接使用。密封类修饰符不能作其它类的基类,可以由其它类继承而来但不能再派生其它类。符不能作其它类的基类,可以由其它类继承而来但不能再派生其它类。一个类不能同时既使用抽象类修饰符又使用密封类修饰符。一个类不能同时既使用抽象类修饰符又使用密封类修饰符。 (5 5)如果省略类修饰符,则默认为私有修饰符)如果省略类修饰符,则默认为私有修饰符privateprivate。 (6 6)对于具有继承关系的类才有基类。如果一个类没有从任何类继)对于具有继承关系的类才有基类。如果一个类没有从任何类继承,就不需要基类类名选项。在承,就不需要基类类名选项。在C#C#中,一个类只能从另一

52、个类中继承,中,一个类只能从另一个类中继承,而不能从多个类中继承;如果一个类想继承多个类的特点,可以采用接而不能从多个类中继承;如果一个类想继承多个类的特点,可以采用接口的方法实现。口的方法实现。 在在C#C#中,对象的定义很简单,其定义格式为:中,对象的定义很简单,其定义格式为: 类名类名 对象名对象名; ; 创建一个类的实例一般采用创建一个类的实例一般采用newnew修饰符。例如:修饰符。例如:VisualC#07-1面向对象和类using System;using System;class ClassAclass ClassA public string c=This is ClassA

53、.; public string c=This is ClassA.; class ClassBclass ClassB static void Fun() static void Fun() ClassA a; ClassA a; a=new ClassA(); a=new ClassA(); Console.WriteLine(a.c); Console.WriteLine(a.c); static void Main() static void Main() Fun(); Fun(); 程序运行结果为:This is ClassA.类的继承也很简单,请看如下代码:VisualC#07-1

54、面向对象和类程序运行结果为:This is ClassA.VisualC#07-1面向对象和类第7章 面向对象和类7.3.2 类的成员类的成员 在在C#C#中,类的成员分为两大类,一种不以函数形式体中,类的成员分为两大类,一种不以函数形式体现,称为成员变量;另一种是以函数形式体现,称为成员现,称为成员变量;另一种是以函数形式体现,称为成员函数。类的具体成员有以下类型:函数。类的具体成员有以下类型: 常量常量:代表与类相关的常量值。:代表与类相关的常量值。 变量变量:类中的变量。:类中的变量。 方法方法:完成类中各种计算或功能的操作。:完成类中各种计算或功能的操作。 属性属性:定义类的值,并对它

55、们提供读、写操作。:定义类的值,并对它们提供读、写操作。 事件事件:由类产生的通知,用于说明发生了什么事情。:由类产生的通知,用于说明发生了什么事情。VisualC#07-1面向对象和类索引器索引器:允许编程人员在访问数组时,通过索引器访问类的多个实例。:允许编程人员在访问数组时,通过索引器访问类的多个实例。 索引器又称下标指示器。索引器又称下标指示器。运算符运算符:定义类的实例能使用的运算符。:定义类的实例能使用的运算符。类类 型型:属于类的局部类型。:属于类的局部类型。构造函数构造函数:在类被实例化时首先执行的函数,主要是完成对象的初始化:在类被实例化时首先执行的函数,主要是完成对象的初始

56、化 操作。操作。析构函数析构函数:在对象被销毁之前最后执行的函数,主要是完成对象结束时:在对象被销毁之前最后执行的函数,主要是完成对象结束时 的收尾操作。的收尾操作。提示:以上各类型中,方法、属性、索引器、运算符、构造函数和析构函提示:以上各类型中,方法、属性、索引器、运算符、构造函数和析构函数是以函数形式体现,统称为成员函数。其它部分统称为成员变量。数是以函数形式体现,统称为成员函数。其它部分统称为成员变量。 VisualC#07-1面向对象和类用户可以根据具体需要定义类的成员,但定义时需要注意用户可以根据具体需要定义类的成员,但定义时需要注意以下几个问题:以下几个问题:(1 1)由于构造函

57、数规定为和类名相同,析构函数名规定)由于构造函数规定为和类名相同,析构函数名规定为类名前加一个为类名前加一个“”波浪线符号,所以其它成员名就不波浪线符号,所以其它成员名就不能命名为和类同名或是类名前加波浪线。能命名为和类同名或是类名前加波浪线。(2 2)类中的常量、变量、属性、事件或类型不能与其它)类中的常量、变量、属性、事件或类型不能与其它类成员同名。类成员同名。(3 3)类中的方法名不能和类中其它成员同名,既包括其)类中的方法名不能和类中其它成员同名,既包括其它非方法成员,又包括其它方法成员。它非方法成员,又包括其它方法成员。(4 4)如果)如果没有显示指定类成员访问修饰符没有显示指定类成

58、员访问修饰符,默认类型为,默认类型为私有类型修饰符。私有类型修饰符。VisualC#07-1面向对象和类 类的每个成员都需要设定访问修饰符,不同的修饰符会造类的每个成员都需要设定访问修饰符,不同的修饰符会造成对成员访问能力不一样。成对成员访问能力不一样。C#C#中成员主要有以下几种:中成员主要有以下几种:公有成员公有成员。这种成员允许类的内部或外界直接访问,修饰。这种成员允许类的内部或外界直接访问,修饰符是符是publicpublic。这是限制最少的一种访问方式,它的优点是。这是限制最少的一种访问方式,它的优点是使用灵活,缺点是外界可能会破坏对象成员值的合理性。使用灵活,缺点是外界可能会破坏对

59、象成员值的合理性。私有成员私有成员。外界不能直接访问该成员变量或成员函数。对。外界不能直接访问该成员变量或成员函数。对该成员变量或成员函数的访问只能由该类中其它函数访问,该成员变量或成员函数的访问只能由该类中其它函数访问,其派生类也不能访问。其派生类也不能访问。保护成员保护成员。对于外界该成员是隐藏的,但这个类的派生类。对于外界该成员是隐藏的,但这个类的派生类则可以访问。则可以访问。内部成员内部成员。只有本类的成员才能访问。只有本类的成员才能访问。下面成员代码说明了成员访问修饰符的作用。下面成员代码说明了成员访问修饰符的作用。VisualC#07-1面向对象和类class ClassAclas

60、s ClassA public int a; public int a; private int b; private int b; protected int c; protected int c; public void SetA() public void SetA() a=1; a=1; /正确,类自身的公有成员正确,类自身的公有成员 b=2; b=2; /正确,类自身的私有成员正确,类自身的私有成员 c=3; c=3; /正确,类自身的保护成员正确,类自身的保护成员 class ClassB:ClassAclass ClassB:ClassA public void SetB() p

温馨提示

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

评论

0/150

提交评论