第6章面向对象程序设计.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章面向对象程序设计6.1面向对象程序设计概述6.2命名空间6.3类6.4对象6.5构造函数和析构函数6.6静态成员6.7属性6.8方法6.9索引器6.10委托6.11事件6.12运算符重载6.13类的转换6.1面向对象程序设计概述6.1.1面向对象的基本概念类和对象属性、方法和事件封装继承重载与重写面向过程学生一天的生活(){事情—函数}{起床;洗漱;吃早餐;上学;放学;做作业;吃晚饭;睡觉;}面向对象出现如果我们现在要描述工人一天的生活时,对比学生一天的生活步骤,我们会发现有很多是重复的,但是工人不做作业,而是工作;如果用面向过程来描述这三种人的一天,必须写3个这样的函数,这3个函数在很多方面都是重复的,并且如果现在在这个人的生活中各增加一个函数,比如运动,那么我们修改起来也是需要大面积的改动,这无疑增加了程序员编程的繁琐,也降低的代码的性能,这时面向对象的编程思想出现了。6.1.2面向对象的优点维护简单。可扩充性。代码重用。概念类就是具有相同的属性和功能的对象的抽象的集合。对象是一个自包含的实体,用一组可识别的特性和行为来标识。类和对象的区别类和对象的区别“人”是类“张三”、“李四”是“人”这个类实例化的对象。9类的定义属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬吠6.3类6.3.1类的声明类的声明语法格式如下:[类的修饰符]class类名[:基类名]{//类的成员;}[;]例如,以下声明了一个Person类:publicclassPerson{publicintpno;//编号publicstringpname;//姓名publicvoidsetdata(intno,stringname){pno=no;pname=name;}publicvoiddispdata(){Console.WriteLine({0}{1},pno,pname);}}类的成员类的修饰符类的访问修饰符旁白说明public谁都可以公有类。表示不受限制对该类的访问。protected家族允许保护类。表示只能从所在类和所在类派生的子类进行访问。internal同事允许内部类。只有其所在程序集中的类才能访问。private自己才行私有类。只有该类才能访问。访问修饰符public:对任何类和成员都公开,无限制访问;protected:仅仅对该类以及该类的派生类公开;private:仅仅对该类公开;internal:只能值包含该类的程序集中访问该类(只是单独的项目,而不是整个解决方案);protectedinternal:只能在本类,派生类或者包含该类的程序集中访问.类的其他常用修饰符abstract抽象类。表示该类是一个不完整的类,不允许建立类的实例。static静态类不能实例化,当类中没有依赖对象标识的数据或行为时,就可以使用静态类。sealed密封类。不允许从该类派生新的类。6.3.2类的成员类的成员说明字段字段存储类要满足其设计所需要的数据,亦称为数据成员。属性属性是类中可以像类中的字段一样被访问的方法。属性可以为类字段提供保护,避免字段在对象不知道的情况下被更改。方法方法定义类可以执行的操作。方法可以接受提供输入数据的参数,并且可以通过参数返回输出数据。方法还可以不使用参数而直接返回值。事件事件是向其他对象提供有关事件发生(如单击按钮或成功完成某个方法)通知的一种方式。索引器索引器允许以类似于数组的方式为对象建立索引。运算符运算符是对操作数执行运算的术语或符号,如+、*、等。构造函数构造函数是在第一次创建对象时调用的方法。它们通常用于初始化对象的数据。析构函数析构函数是当对象即将从内存中移除时由运行库执行引擎调用的方法。它们通常用来确保需要释放的所有资源都得到了适当的处理。类成员的修饰符说明public公有成员。提供了类的外部界面,允许类的使用者从外部进行访问,这是限制最少的一种访问方式。private私有成员(默认的)。仅限于类中的成员可以访问,从类的外部访问私有成员是不合法的,如果在声明中没有出现成员的访问修饰符,按照默认方式成员为私有的。protected保护成员。这类成员不允许外部访问,但允许其派生类成员访问。internal内部成员。允许同一个命名空间中的类访问。readonly只读成员。这类成员的值只能读,不能写。也就是说,除了赋予初始值外,在程序的任何部分将无法更改这个成员的值。6.3.3分部类分部类可以将类(结构或接口等)的声明拆分到两个或多个源文件中。若要拆分类的代码,被拆分类的每一部分的定义前边都要用partial关键字修饰。分部类的每一部分都可以存放在不同的文件中,编译时会自动将所有部分组合起来构成一个完整的类声明。6.2命名空间6.2.1命名空间概述在.NET中,类是通过命名空间(namespace)来组织的。命名空间提供了可以将类分成逻辑组的方法,将系统中的大量类库有序地组织起来,使得类更容易使用和管理。可以将命名空间想像成文件夹,类的文件夹就是命名空间,不同的命名空间内,可以定义许多类。在每个命名空间下,所有的类都是“独立”且“唯一”的。6.2.2使用命名空间在C#中,使用命名空间有两种方式,一种是明确指出命名空间的位置,另一种是通过using关键字引用命名空间。直接定位在应用程序中,任何一个命名空间都可以在代码中直接使用。例如:System.Console.WriteLine(ABC);这个语句是调用了System命名空间中Console类的WriteLine方法。1)使用using关键字在应用程序中要使用一个命名空间,还可以采取引用命名空间的方法,在引用后,应用程序中就可使用该命名空间内的任一个类了。引用命名空间的方法是利用using关键字,其使用格式如下:using[别名=]命名空间或using[别名=]命名空间.成员2)自定义命名空间在C#中,除了使用系统的命名空间外,还可以在应用程序中自已声明命名空间。其使用语法格式如下:namespace命名空间名称{命名空间定义体}其中,“命名空间名称”指出命名空间的唯一名称,必须是有效的C#标识符。例如,在应用程序中自定义Ns1命名空间:namespaceNs1{classA{…}classB{…}}6.4对象6.4.1定义类的对象一旦声明了一个类,就可以用它作为数据类型来定义类对象(简称为对象)。定义类的对象分以下两步:1)定义对象引用其语法格式如下:类名对象名;例如,以下语句定义Person类的对象引用p:Personp;2)创建类的实例其语法格式如下:对象名=new类名();例如,以下语句创建Person类的对象实例:p=newPersone();以上两步也可以合并成一步。其语法格式如下:类名对象名=new类名();例如:Personp=newPerson();理解对象引用和类实例的区别。两个对象引用可以引用同一个对象,例如:Personp1=newPerson();Personp2=p1;p1p26.4.2访问对象的字段访问对象字段的语法格式如下:对象名.字段名其中,“.”是一个运算符,该运算符的功能是表示对象的成员。例如,前面定义的p对象的成员变量表示为:p.pno,p.pname6.4.3调用对象的方法调用对象的方法的语法格式如下:对象名.方法名(参数表)例如,调用前面定义的p对象的成员方法setdata为:p.setdata(101,Mary);【例6.1】设计一个控制台应用程序,说明调用对象方法的过程。usingSystem;namespaceProj6_1{publicclassTPoint//声明类TPoint{intx,y;//类的私有字段publicvoidsetpoint(intx1,inty1){x=x1;y=y1;}publicvoiddispoint(){Console.WriteLine(({0},{1}),x,y);}}classProgram{staticvoidMain(string[]args){TPointp1=newTPoint();//定义对象p1p1.setpoint(2,6);Console.Write(第一个点=);p1.dispoint();TPointp2=newTPoint();//定义对象p2p2.setpoint(8,3);Console.Write(第二个点=);p2.dispoint();}}}6.5构造函数和析构函数6.5.1构造函数1.什么是构造函数构造函数是在创建给定类型的对象时执行的类方法。构造函数具有如下性质:构造函数的名称与类的名称相同。构造函数尽管是一个函数,但没有任何类型,即它既不属于返回值函数也不属于void函数。一个类可以有多个构造函数,但所有构造函数的名称都必须相同,它们的参数各不相同,即构造函数可以重载。当类对象创建时,构造函数会自动地执行;由于它们没有返回类型,因此不能像其他函数那样进行调用。当类对象声明时,调用哪一个构造函数取决于传递给它的参数类型。构造函数不能被继承。2.调用构造函数当定义类对象时,构造函数会自动执行。1)调用默认构造函数不带参数的构造函数称为默认构造函数。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。假设一个类包含有默认构造函数,调用默认构造函数的语法如下:类名对象名=new类名();如果没有为对象提供构造函数,则默认情况下C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为相应的默认值。2)调用带参数的构造函数假设一个类中包含有带参数的构造函数,调用这种带参数的构造函数的语法如下:类名对象名=new类名(参数表);【例6.2】设计一个控制台应用程序,说明调用构造函数的过程。namespaceProj6_2{classProgram{publicclassTPoint1//声明类TPoint1{intx,y;//类的私有变量publicTPoint1(){}//默认的构造函数publicTPoint1(intx1,inty1)//带参数的构造函数{x=x1;y=y1;}publicvoiddispoint(){Console.WriteLine(({0},{1}),x,y);}}staticvoidMain(string[]args){TPoint1p1=newTPoint1();//调用默认的构造函数Console.Write(第一个点=);p1.dispoint();TPoint1p2=newTPoint1(8,3);//调用带参数的构造函数Console.Write(第二个点=);p2.dispoint();}}}6.5.2析构函数1.什么是析构函数在对象不再需要时,希望确保它所占的存储空间能被收回。C#中提供了析构函数用于专门释放被占用的系统资源。析构函数具有如下性质:析构函数在类对象销毁时自动执行。一个类只能有一个析构函数,而且析构函数没有参数,即析构函数不能重载。析构函数的名称是“~”加上类的名称(中间没有空格)。与构造函数一样,析构函数也没有返回类型。析构函数不能被继承。2.调用析构函数当一个对象被系统销毁时自动调用类的析构函数。【例6.3】设计一个控制台应用程序,说明调用析构函数的过程。usingSystem;namespaceProj6_3{classProgram{publicclassTPoint2//声明类TPoint2{intx,y;publicTPoint2(intx1,inty1)//带参数的构造函数{x=x1;y=y1;}~TPoint2(){Console.WriteLine(点=({0},{1}),x,y);}}staticvoidMain(string[]args){TPoint2p1=newTPoint2(2,6);TPoint2p2=newTPoint2(8,3);}}}星星示例privatevoidbutt

1 / 99
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功