面向对象和类的设计说课讲解课件

上传人:沈*** 文档编号:241846378 上传时间:2024-07-30 格式:PPT 页数:88 大小:687KB
返回 下载 相关 举报
面向对象和类的设计说课讲解课件_第1页
第1页 / 共88页
面向对象和类的设计说课讲解课件_第2页
第2页 / 共88页
面向对象和类的设计说课讲解课件_第3页
第3页 / 共88页
点击查看更多>>
资源描述
面向对象基本概念及面向对象基本概念及类的设计类的设计面向对象的基本概念面向对象的基本概念n nOOP以待解问题中涉及的对象为主要矛盾n n对象(Object)和类(Class)n n对象,是现实世界中的物理实体在计算机逻辑对象,是现实世界中的物理实体在计算机逻辑中的映射和体现。中的映射和体现。n n类,是同种对象的集合与抽象。(模板)类,是同种对象的集合与抽象。(模板)n n消息(Message)传递n n一个面向对象的程序由许多对象组成,这些对一个面向对象的程序由许多对象组成,这些对象之间对象之间通过收发信息相互沟通。象之间对象之间通过收发信息相互沟通。n n对于对象来说,消息就是请求执行某个过程。对于对象来说,消息就是请求执行某个过程。面向对象的基本概念面向对象的基本概念对象类实体抽象数据类概念世界现实世界计算机世界抽象实例化抽象计算机逻辑实现映射面向对象的基本概念面向对象的基本概念n n对象的组成n n标识标识n n用以区别不同对象的唯一标志用以区别不同对象的唯一标志n n用用“对象名对象名”表达表达n n状态状态n n又称静态属性,指对象内部包含的信息又称静态属性,指对象内部包含的信息n n用用“数据成员(域)数据成员(域)”表达表达n n行为行为n n对象的动态属性,指对象可进行的操作对象的动态属性,指对象可进行的操作n n使用使用“函数成员(方法)函数成员(方法)”表达表达对象和类之间对象和类之间n n对象对象对象对象可以是现实生活中的一个物理对象,还可以是某一类可以是现实生活中的一个物理对象,还可以是某一类可以是现实生活中的一个物理对象,还可以是某一类可以是现实生活中的一个物理对象,还可以是某一类概念实体的实例。例如:一辆汽车、一个人、一本书,乃概念实体的实例。例如:一辆汽车、一个人、一本书,乃概念实体的实例。例如:一辆汽车、一个人、一本书,乃概念实体的实例。例如:一辆汽车、一个人、一本书,乃至一种语言、一个图形、一种管理方式,都可以作为一个至一种语言、一个图形、一种管理方式,都可以作为一个至一种语言、一个图形、一种管理方式,都可以作为一个至一种语言、一个图形、一种管理方式,都可以作为一个对象。对象。对象。对象。n n类类类类是一组具有相同数据结构和相同操作的对象的集合。类是一组具有相同数据结构和相同操作的对象的集合。类是一组具有相同数据结构和相同操作的对象的集合。类是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特是对一系列具有相同性质的对象的抽象,是对对象共同特是对一系列具有相同性质的对象的抽象,是对对象共同特是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。比如每一辆汽车是一个对象的话,所有的汽车征的描述。比如每一辆汽车是一个对象的话,所有的汽车征的描述。比如每一辆汽车是一个对象的话,所有的汽车征的描述。比如每一辆汽车是一个对象的话,所有的汽车可以作为一个模板,我们就定义汽车这个类。可以作为一个模板,我们就定义汽车这个类。可以作为一个模板,我们就定义汽车这个类。可以作为一个模板,我们就定义汽车这个类。n n可以使用类的定义实例化对象,这表示创建该类的一个实可以使用类的定义实例化对象,这表示创建该类的一个实可以使用类的定义实例化对象,这表示创建该类的一个实可以使用类的定义实例化对象,这表示创建该类的一个实例。例。例。例。n n从类定义中产生对象,必须有建立实例的操作。从类定义中产生对象,必须有建立实例的操作。从类定义中产生对象,必须有建立实例的操作。从类定义中产生对象,必须有建立实例的操作。结构化程序设计回顾结构化程序设计回顾主程序函数1函数2函数3函数4函数5函数6函数7函数7自顶向下的设计方法:结构化程序设计回顾结构化程序设计回顾全局数据全局数据函数1局部数据函数2局部数据函数3局部数据面向过程程序中函数和数据的关系:程序程序=数据结构数据结构+算法算法面向对象程序设计(面向对象程序设计(OOP)n n面向对象程序设计技术汲取了结构化程序设计中面向对象程序设计技术汲取了结构化程序设计中好的思想,并将这些思想与一些新的、强大的理好的思想,并将这些思想与一些新的、强大的理念相结合,从而给你的程序设计工作提供了一种念相结合,从而给你的程序设计工作提供了一种全新的方法。全新的方法。n n通常,在面向对象的程序设计风格中,你会将一通常,在面向对象的程序设计风格中,你会将一个问题分解为一些相互关联的子集,每个子集内个问题分解为一些相互关联的子集,每个子集内部都包含了相关的数据和函数。同时,你会以某部都包含了相关的数据和函数。同时,你会以某种方式将这些子集分为不同等级,而一个对象就种方式将这些子集分为不同等级,而一个对象就是已定义的某个类型的变量。当你定义了一个对是已定义的某个类型的变量。当你定义了一个对象,你就隐含的创建了一个新的数据类型。象,你就隐含的创建了一个新的数据类型。面向对象程序设计(面向对象程序设计(OOP)对象A数据方法对象B数据方法对象C数据方法对象D数据方法消息消息消息消息面向对象程序设计中的数据和函数的组织结构:实例实例1:电灯:电灯n n数据(状态):亮/暗n n方法(动作):开、关n n用户通过方法改变电灯内部的数据实例实例2.汽车汽车实例实例3:八皇后问题:八皇后问题n n八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。实例实例3:八皇后问题:八皇后问题n n结构化编程实现n n面向对象编程实现面向对象程序设计的特点面向对象程序设计的特点n n抽象性n n抽象(抽象(abstractionabstraction):去掉研究问题中次要的):去掉研究问题中次要的部分,仅仅抽取主要的、本质的部分进行研究部分,仅仅抽取主要的、本质的部分进行研究的方法。的方法。n n过程抽象:面向过程方法使用过程抽象:面向过程方法使用n n数据抽象:面向对象方法使用数据抽象:面向对象方法使用n n抽象数据类型(抽象数据类型(ADTADT)面向对象程序设计的特点面向对象程序设计的特点n n封装性n n封装(封装(encapsulationencapsulation):利用):利用ADTADT将数据和基将数据和基于数据的操作密封在一起,系统的其它对象只于数据的操作密封在一起,系统的其它对象只能通过界面与其交互。能通过界面与其交互。n n封装机制将数据和代码捆绑到一起,避免了外封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。界的干扰和不确定性。n n封装的优点封装的优点n n提高了系统灵活性提高了系统灵活性n n提高了系统安全性提高了系统安全性n n实例:银行账户实例:银行账户面向对象程序设计的特点面向对象程序设计的特点n n继承性(具体化)继承性(具体化)n n继承(继承(InheritanceInheritance)是可以让某个类型的对象获得另一)是可以让某个类型的对象获得另一个类型的对象的属性的方法。个类型的对象的属性的方法。n n允允允允许许许许程程程程序序序序设设设设计计计计人人人人员员员员在在在在设设设设计计计计新新新新类类类类时时时时,只只只只考考考考虑虑虑虑与与与与已已已已有有有有的的的的父父父父类类类类所所所所不不不不同同同同的部分,从而继承父类的内容为自己的组成部分的部分,从而继承父类的内容为自己的组成部分的部分,从而继承父类的内容为自己的组成部分的部分,从而继承父类的内容为自己的组成部分n n可在子类中重写方法的实现,改变父类中不适合子类的行为可在子类中重写方法的实现,改变父类中不适合子类的行为可在子类中重写方法的实现,改变父类中不适合子类的行为可在子类中重写方法的实现,改变父类中不适合子类的行为n n提提提提高高高高了了了了代代代代码码码码复复复复用用用用率率率率,能能能能使使使使开开开开发发发发者者者者的的的的大大大大部部部部分分分分精精精精力力力力用用用用于于于于系系系系统统统统特特特特殊殊殊殊的的的的设计,便于软件的演进和增量式扩充。设计,便于软件的演进和增量式扩充。设计,便于软件的演进和增量式扩充。设计,便于软件的演进和增量式扩充。n nC#C#C#C#只支持单继承,但支持多重接口的继承实现只支持单继承,但支持多重接口的继承实现只支持单继承,但支持多重接口的继承实现只支持单继承,但支持多重接口的继承实现n n继承支持按级分类的概念。继承支持按级分类的概念。n n继承很好的支持代码的重用性(继承很好的支持代码的重用性(reusabilityreusability)。面向对象程序设计的特点面向对象程序设计的特点n n多态性多态性n n多态(多态(PolymorphismPolymorphism):多态的意思是事物具有不同):多态的意思是事物具有不同形式的能力。例如,对不同的实例,某个操作可能会形式的能力。例如,对不同的实例,某个操作可能会有不同的行为。这个行为依赖于所要操作数据的类型。有不同的行为。这个行为依赖于所要操作数据的类型。n n多态机制使具有不同内部结构的对象可以共享相同的多态机制使具有不同内部结构的对象可以共享相同的外部接口。外部接口。n n多态的实现多态的实现n n重载(重载(overloadoverload)n n覆盖(覆盖(overrideoverride)n n实例:实例:cd/dvdcd/dvd播放播放OOP概念总结n任何事物都是一个对象任何事物都是一个对象n通过相互联系的对象请求其他对象执行一定的行为来完成计算。通过相互联系的对象请求其他对象执行一定的行为来完成计算。对象之间通过发送和接收消息来进行通信。对象之间通过发送和接收消息来进行通信。n每个对象都有自己的存储空间,用来存储其它对象每个对象都有自己的存储空间,用来存储其它对象n每个对象都是一个类的实例。类用来代表一组相似的对象及其每个对象都是一个类的实例。类用来代表一组相似的对象及其相关的行为,即同一个类的多个对象能执行相同行为相关的行为,即同一个类的多个对象能执行相同行为n类可以组织成一个单根树状组织,成为继承层次,每个类事例类可以组织成一个单根树状组织,成为继承层次,每个类事例的存储空间和行为自动被其派生类使用的存储空间和行为自动被其派生类使用从一个实例出发:图书馆管理系统从一个实例出发:图书馆管理系统n n功能需求:功能需求:功能需求:功能需求:1.1.一一一一个个个个图图图图书书书书馆馆馆馆藏藏藏藏有有有有图图图图书书书书和和和和期期期期刊刊刊刊杂杂杂杂志志志志两两两两大大大大类类类类书书书书籍籍籍籍,每每每每种种种种图图图图书书书书/杂志可以有多册。杂志可以有多册。杂志可以有多册。杂志可以有多册。2.2.图书馆可以维护(注册、更新和删除)图书资料。图书馆可以维护(注册、更新和删除)图书资料。图书馆可以维护(注册、更新和删除)图书资料。图书馆可以维护(注册、更新和删除)图书资料。3.3.图书管理员在系统的支持下,负责与借书者打交道。图书管理员在系统的支持下,负责与借书者打交道。图书管理员在系统的支持下,负责与借书者打交道。图书管理员在系统的支持下,负责与借书者打交道。4.4.借书者可以预约目前借不到的书或杂志。借书者可以预约目前借不到的书或杂志。借书者可以预约目前借不到的书或杂志。借书者可以预约目前借不到的书或杂志。5.5.所有人员都可以浏览图书馆的图书信息和各种告示。所有人员都可以浏览图书馆的图书信息和各种告示。所有人员都可以浏览图书馆的图书信息和各种告示。所有人员都可以浏览图书馆的图书信息和各种告示。从一个实例出发:图书馆管理系统从一个实例出发:图书馆管理系统n n非功能需求非功能需求1.1.系系系系统统统统能能能能够够够够在在在在所所所所有有有有流流流流行行行行的的的的技技技技术术术术环环环环境境境境下下下下运运运运行行行行,有有有有一一一一个个个个良良良良好好好好的交互界面。的交互界面。的交互界面。的交互界面。2.2.系统应该具有良好的可扩展性。系统应该具有良好的可扩展性。系统应该具有良好的可扩展性。系统应该具有良好的可扩展性。n n取名:取名:LibM图书馆系统的用例视图图书馆系统的用例视图查询图书查询图书查询系统信息查询系统信息系统管系统管理员理员借书者借书者一般浏一般浏览者览者普通管普通管理员理员借书借书还书还书续借续借预约预约查询账户查询账户注册借书者注册借书者更新借书者更新借书者注销借书者注销借书者更新图书更新图书删除图书删除图书录入书目录入书目更新书目更新书目删除书目删除书目管理借书者管理借书者管理书目管理书目管理图书管理图书录入图书录入图书建立侯选类建立侯选类n n给出非形式化描述:借书者通过管理员可以借、还、续借图书馆的图书;图书馆的管理员维护借书者、图书目录和图书信息;借书者还可以预约没有归还的图书或新书,也可以取消预约,浏览和查询个人和图书信息;图书可以有多本,借书者不能借超过规定数目的图书;如果借书者有超期的图书或罚金额度超过2元,则不能借书。借书者借书者图书图书图书目录图书目录设计设计LibM的类的类n n类的对象应该管理自己的数据并承担其责任n n借书者n n属性:谁?借了哪些书?罚金多少?属性:谁?借了哪些书?罚金多少?n n功能:借书、续借、还、预约、交罚款。功能:借书、续借、还、预约、交罚款。n n图书(对应实际的书)n n属性:书名、作者、出借日期属性:书名、作者、出借日期n n功能:被借、被归还功能:被借、被归还n n图书目录(对应管理的书)n n属性:哪本书?可借数?预约数?属性:哪本书?可借数?预约数?n n功能:借、归还、预约功能:借、归还、预约类的声明类的声明类的修饰符class类名/类成员的声明/嵌套类的声明类的成员类的成员n n类自身声明的类自身声明的+基类中继承的基类中继承的n n成员分类成员分类常量常量变量变量构造函数和析构函数,对类的实例进行初始化和销毁构造函数和析构函数,对类的实例进行初始化和销毁成员方法,复杂执行类中的计算和其他操作成员方法,复杂执行类中的计算和其他操作属性,定义类中的值,并对他们进行读写属性,定义类中的值,并对他们进行读写事件,用于通知其他类发生了一件什么事情事件,用于通知其他类发生了一件什么事情索引指示器,允许象使用数组一样为类添加路径列表索引指示器,允许象使用数组一样为类添加路径列表操作符,定义类中特有的操作操作符,定义类中特有的操作定义定义LibM的类的类这些类无法使用!访问修饰符访问修饰符n类访问修饰符:npublicnprivatenprotectedninternaln成员访问修饰符:npublicnprivatenprotectedninternalninternalprotected默认默认默认默认学会学习:学会学习:internal的含义?的含义?使用使用LibM的类的类如何确定归还书所对应的图书目录呢?n n思路n n首先,必须知道要归还的图书。首先,必须知道要归还的图书。n n其次,根据图书确定图书目录。其次,根据图书确定图书目录。n n解决方法:n n在某个类中提供根据图书获取图书目录的方法。在某个类中提供根据图书获取图书目录的方法。n n哪个类?n n图书、图书目录、借书者?图书、图书目录、借书者?n n困境:把获取图书目录的任务交给图书目录?确定图书所对应的图书目录静态方法!静态成员和实例成员静态成员和实例成员n n类的静态成员是类的一部分,但它独立于任何一类的静态成员是类的一部分,但它独立于任何一个单独的类实例,在类的实例被创建前就可被引个单独的类实例,在类的实例被创建前就可被引用,所有的类实例共享该静态成员。用,所有的类实例共享该静态成员。n n类名类名.静态成员名静态成员名n n非静态(实例)数据成员存储于特定的类实例绑非静态(实例)数据成员存储于特定的类实例绑定,必须在类实例被创建出来后才具有存储空间定,必须在类实例被创建出来后才具有存储空间并对其进行操作。并对其进行操作。类名类名id=newid=new类名类名();();id.id.实例成员实例成员静态成员举例静态成员举例成员的初始化静态类静态类n n所有成员都是静态成员的类。n n无法创建静态类的实例。n n用途:控制类、工具类。n n比较:n nMathMath类类intr=Math.Sqrt(20);/intr=Math.Sqrt(20);/静态方法静态方法n nRandomRandom类类Randomran=newRandom();Randomran=newRandom();intr=ran.Next(20);/intr=ran.Next(20);/实例方法实例方法数据成员的初始化数据成员的初始化n n数据成员可在声数据成员可在声明时被初始化为明时被初始化为某常量,或引用某常量,或引用其他的其他的静态成员静态成员n n不能引用类的非不能引用类的非静态变量成员来静态变量成员来进行其他变量的进行其他变量的初始化初始化 publicclassClass4privateinta;protectedintb=111;publicstaticintc=120;publicstaticintd=c+12;public static int e=b+10;/错误?错误?public int f=b+1;/错误?错误?。Employee中的静态中的静态/实例成员实例成员classEmployeepublicstringFirstName;publicstringLastName;publicdoubleSalary;/静态,从所有该类对象中选择一个改变其状态publicstaticvoidIncreaseSalaryS(Employeee,doublenum)e.Salary+=num;/(实例)方法,对调用该方法的对象起作用publicvoidIncreaseSalaryNS(doublenum)Salary+=num;classProgramstaticvoidMain()Employeee1=newEmployee();Employeee2;/Error!e2此时为空引用/e2.FirstName=Inigo;/e2.LastName=Montaya;/e2.Salary=1000;e1.FirstName=Inigo;e1.LastName=Montaya;e1.Salary=1000;Employee.IncreaseSalaryS(e1,500);e1.IncreaseSalaryNS(500);矩阵乘法的静态和非静态实现矩阵乘法的静态和非静态实现n n现在,你知道为什么Main必须是静态方法了吗?罚款功能的设计罚款功能的设计n n什么时候确定罚款?n n还书的时候。还书的时候。n n谁来负责确定罚款?n n图书目录图书目录n n实体书实体书n n借阅者借阅者n n罚款的规则?n n每超期每超期1 1天罚款天罚款1 1分。分。最佳“人选”常量成员常量的声明成员常量的声明constattributesconstdatatypeidentifier;newpublicprotectedinternalprivateclassApublicconstdoublex=1.0;privateconstinty=2;publicconststringpre=“good”;Const成员本质上是static的,一定是在声明的同时被初始化,其值在编译阶段已确定罚款功能的实现罚款功能的实现构造函数构造函数n前面设计的一个缺陷:n直接把对象内部的成员变量暴露在外。n目标:n在创建对象的同时可以设置成员变量的取值。n实现:构造函数n每个类都必须必须有构造函数,系统自动提供默认构造函数。n创建对象时一定会调用,而且调用自动进行。n若存在多个构造函数,则系统按照参数匹配算法选择最匹配函数n构造函数的三个特性:n与类名同名n不返回任何值n不能显式调用classEmployeestringFirstName;stringLastName;doubleSalary;publicEmployee()FirstName=LastName=N/A;Salary=0;publicEmployee(stringfirstName,stringlastName)FirstName=firstName;LastName=lastName;Salary=1000;publicEmployee(stringfirstName,stringlastName,doublesalary)FirstName=firstName;LastName=lastName;Salary=salary;publicstaticvoidIncreaseSalaryS(Employeee,doublenum)e.Salary+=num;publicvoidIncreaseSalaryNS(doublenum)Salary+=num;publicvoidPrintInfo()Console.WriteLine(01:2,FirstName,LastName,Salary);重载构造函数,若不提供,则系统提供默认无参数的构造函数classProgramstaticvoidMain()Employeee1=newEmployee();Employeee2=newEmployee(John,Smith,3000);Employeee3=newEmployee(Jack,Johns);e1.PrintInfo();e2.PrintInfo();e3.PrintInfo();/加薪Console.WriteLine(加薪后。);e2.IncreaseSalaryNS(1000);Employee.IncreaseSalaryS(e3,1500);e2.PrintInfo();e3.PrintInfo();Console.Read();构造函数注意点构造函数注意点n n构造函数一般不会被显式调用,而由new操作触发,将实例化好的对象返回给new的左值n n构造函数的特征n n构造函数允许重载,若未定义,系统会提供默认构造函数n n一般来说,构造函数应为public,但也存在特殊的情况高级内容:单件模式高级内容:单件模式n n问题:局域网里只有一台打印机,很多人都要打印,因此必须有一个打印机精灵(PrintDeamon)程序来负责排队,怎么保证系统内只有一个实例呢?n n目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。n n解决方案:单件模式,使用私有、静态构造函数publicclassSingletonstaticSingletoninstance=null;Singleton()/必须,否则默认构造函数为publicpublicstaticSingletonGetInstance()if(instance=null)instance=newSingleton();returninstance;classProgrampublicstaticvoidMain()/Singletons=newSingleton();Singletons1=Singleton.GetInstance();Singletons2=Singleton.GetInstance();if(s1=s2)Console.WriteLine(Equal!);Console.Read();this保留字保留字n限于构造函数、析构函数和类的实例方法中使用n类的构造函数中出现,作为引用类型,表示对正在构造的对象本身的引用n类的方法中出现作为引用类型,表示对调用该方法的对象的引用this示例示例(1)usingSystemusingSystem;classAclassA publicintx;publicintx;privatestaticstr=“Helloworld”;privatestaticstr=“Helloworld”;publicvoidfunc()publicvoidfunc()x=5;x=5;Console.WriteLine(“Thevalueofxis:0”,x);Console.WriteLine(“Thevalueofxis:0”,x);Console.WriteLine(“Thevalueofthis.xis:0”,this.x);Console.WriteLine(“Thevalueofthis.xis:0”,this.x);Console.WriteLine(this.str);/Error!Console.WriteLine(this.str);/Error!为何不能使用this来引用静态变量?This举例举例(2)UsingSystemUsingSystem;publicclassPointpublicclassPoint publicintx,y;publicintx,y;/用用thisthis来避免歧义来避免歧义publicvoidSetPoint(intx,inty)publicvoidSetPoint(intx,inty)this.x=x;this.x=x;this.y=y;this.y=y;注意:C#内部,this被定义为一个常量,不能使用this+,this-等表达式,但可将this作为返回值使用This举例(举例(3)classEmployeestringFirstName;stringLastName;doubleSalary;publicEmployee(stringFirstName,stringLastName,doubleSalary)this.FirstName=FirstName;this.LastName=LastName;this.Salary=Salary;publicEmployee(stringFirstName,stringLastName):this(FirstName,LastName,1000)publicstaticvoidIncreaseSalaryS(Employeee,doublenum)e.Salary+=num;publicvoidIncreaseSalaryNS(doublenum)IncreaseSalaryS(this,num);publicvoidPrintInfo()Console.WriteLine(01:2,FirstName,LastName,Salary);ThisThis的典型用法的典型用法1.1.用来引用实例成员,避免歧义用来引用实例成员,避免歧义2.2.在构造函数中用在构造函数中用this()this()调用调用另一个构造函数,避免代码重复另一个构造函数,避免代码重复3.3.表示对象实例本身的引用,将表示对象实例本身的引用,将自己作为参数传递出去自己作为参数传递出去classProgramstaticvoidMain()Employeee2=newEmployee(John,Smith,3000);Employeee3=newEmployee(Jack,Johns);e2.PrintInfo();e3.PrintInfo();/加薪Console.WriteLine(加薪。);e2.IncreaseSalaryNS(1000);Employee.IncreaseSalaryS(e3,1500);e2.PrintInfo();e3.PrintInfo();Console.Read();析构函数(终结器)析构函数(终结器)n n类的实例超出作用域范围时,释放它所占用的资源,由系类的实例超出作用域范围时,释放它所占用的资源,由系统负责调用统负责调用n n形式:形式:类名(),不接受任何参数,也不返回任何值,类名(),不接受任何参数,也不返回任何值,否则报错否则报错n n析构函数不能被继承和显式调用。析构函数不能被继承和显式调用。n n由于由于GCGC,大多数类不用显式定义析构函数,但若在类中,大多数类不用显式定义析构函数,但若在类中申请了独占资源,最好保证在对象结束前释放掉申请了独占资源,最好保证在对象结束前释放掉n n当存在类继承时,基类当存在类继承时,基类/子类的析构函数的调用顺序与构子类的析构函数的调用顺序与构造函数的调用顺序正好相反造函数的调用顺序正好相反n n构造函数:先基类,后子类构造函数:先基类,后子类n n析构函数:先子类,后基类析构函数:先子类,后基类回到书本。回到书本。n nP126n n可用静态字段提供计数、索引等操作n np135p135作业作业4n n定义一个网络用户类,要处理的信息有:用户定义一个网络用户类,要处理的信息有:用户IDID、用户密码、用户密码、emailemail地址,在建立类的实例时,把以地址,在建立类的实例时,把以上三个信息作为构造函数的参数输入,其中用户上三个信息作为构造函数的参数输入,其中用户IDID和用户密码是必须的,缺省的和用户密码是必须的,缺省的emailemail地址是用户地址是用户IDID加上加上“”“”(考察:构造函数的重载)(考察:构造函数的重载)n n统计开学报到的学生数,要求定义一个学生类,统计开学报到的学生数,要求定义一个学生类,由其中的数据成员来跟踪已报到的学生数(使用由其中的数据成员来跟踪已报到的学生数(使用静态成员)静态成员)n n总结你对访问修饰符的不同组合、静态总结你对访问修饰符的不同组合、静态/非静态成非静态成员的区别员的区别LibM的改进版本的改进版本n n封装的第二阶段:数据隐藏n n应用以下技术:n n恰当的访问限定符恰当的访问限定符n n成员常量和成员初始化成员常量和成员初始化n n构造函数、析构函数构造函数、析构函数n n静态成员,静态类静态成员,静态类n n使用getter/Setter函数对对类内部的私有数据进行操作n n优点:n n实现了数据隐藏和安全访问实现了数据隐藏和安全访问n n对读对读/写可进行灵活的控制写可进行灵活的控制n n缺点:n n代码比较繁琐代码比较繁琐n n可读性较差,影响到可编程性可读性较差,影响到可编程性n n有没有两全其美的方法呢?属性属性属性属性类的属性成员类的属性成员n n用来描述、表达对象的一些特征属性,是对变量成员的一种扩展n nC#中,属性使用专门的访问函数对属性值进行读写操作,提供了比变量成员更为灵活的应用机制n n使用时形式上像数据成员(虚字段),本质上是方法n n格式修饰符数据类型属性名访问函数体访问函数访问函数 get/setn nget用于向外部返回属性成员的值,不带参数修饰符get语句或语句块n nSet用于处理类外部的写入值,是一个带有简单值类型参数的方法修饰符set语句或语句块n n特殊关键字value-set函数的隐式参数n n示例代码:用属性改写Box(p150)属性的常见用法属性的常见用法n n可以在get和set操作中根据需要添加验证代码:n n读取某字段时判断有没有权限读取某字段时判断有没有权限n n设置某字段时判断新值是否合法设置某字段时判断新值是否合法n n根据系统的需求,只提供get/set访问器,即只读/只写属性publicclassEmployeeprivatestringname;privatelongidcard;privatedoublesalary;privatedoubleincrease;publicvoidPrint()Console.WriteLine(姓名:0,name);Console.WriteLine(身份证号:0,idcard);Console.WriteLine(基本工资:0,C,salary);Console.WriteLine(增加工资:0:C,increase);publicvoidRaise(doublepercent)increase=percent*salary;publicdoubleSalarygetreturnsalary;setif(value=0)Console.Write(Itsnotavalidsalary!);elsesalary=value;publicstringNamegetreturnname;setname=value;publiclongIDgetreturnidcard;/为保证唯一,一般不修改publicdoubleIncreasegetreturnincrease;员工的工资必须为非负数对一般用户而言,工资的增长率应该是只读的 使用属性使用属性n n如果只提供如果只提供getget访问器访问器,那么这个属性是只读的。那么这个属性是只读的。n n如果只提供如果只提供setset访问器,那么这个属性是只写的。访问器,那么这个属性是只写的。建议:将所有字段都定义为将所有字段都定义为privateprivate。如果字段需要公开,请使用属性将其公开如果字段需要公开,请使用属性将其公开属性使用的另一例子属性使用的另一例子示例示例MyTimen n定义类对象的状态对象的状态对象的行为对象的行为字段字段属性属性方法方法C#支持的第三种注释方式,提供标准的方式对函数的功能、参数、返回值进行说明类成员的访问属性类成员的访问属性n n上述上述MyTimeMyTime类中,所有成员的访问属性都是类中,所有成员的访问属性都是public.public.n n这样,我们想获得这样,我们想获得 小时数、分钟数、秒数小时数、分钟数、秒数 比较方比较方便便类成员的访问属性类成员的访问属性n n但也带来了不安全的因素,因为但也带来了不安全的因素,因为publicpublic属性既可以属性既可以让任何人来读,也可以让任何人来改写。让任何人来读,也可以让任何人来改写。类成员的访问属性类成员的访问属性n n那么,我们将类的字段的访问属性定义为那么,我们将类的字段的访问属性定义为private.private.q这样,在类的外部这样,在类的外部(类的使类的使用者用者)就无法修改这个字段就无法修改这个字段的值,因为根本看不到。的值,因为根本看不到。q当然,也没有办法取它的当然,也没有办法取它的值了。值了。n n有没有一种途径,它可以让使用者像使用公共的字段一样方便,又能让设计者能够进行安全地检查?使用属性使用属性n n我们可以使用我们可以使用属性属性来解决这个问题。来解决这个问题。n n属性,从外部属性,从外部(类的使用者类的使用者)来看,类似于类的字段。来看,类似于类的字段。从内部从内部(类的作者类的作者)来看,类似于类的方法来看,类似于类的方法。getget访问器访问器setset访问器访问器MyTimepreTime=newMyTime(19,34,56);MyTimenowTime=newMyTime(21,45,26);/这句错误,因为hour为私有域,不能在MyTime类外被访问intelapsedHour=nowTime.hour-preTime.hour;/error!intelapsedHour=nowTime.Hour-preTime.Hour;/Correct!nowTime.Minute=106;nowTime.Second+=20;先调用先调用Second属性的一次属性的一次Get操作,再调用一次操作,再调用一次Set操作操作调用调用set操作,但由于操作,但由于if条件不满条件不满足,足,minute不变不变属性成员属性成员vs.变量成员变量成员n n变量成员本质上就是变量,而属性成员更大程度变量成员本质上就是变量,而属性成员更大程度上是函数成员的一种,只是操作时形式比较类似上是函数成员的一种,只是操作时形式比较类似变量访问变量访问n n属性成员在访问修饰符的基础上通过属性成员在访问修饰符的基础上通过get/setget/set函数提函数提供对属性的更为灵活、安全的访问控制,可为供对属性的更为灵活、安全的访问控制,可为(私有)(私有)的变量成员多一层逻辑保护,而变量成的变量成员多一层逻辑保护,而变量成员只能通过访问修饰符提供基本的数据隐藏功能员只能通过访问修饰符提供基本的数据隐藏功能n n属性成员可通过只公开属性成员可通过只公开get/setget/set,实现成员的只读,实现成员的只读/只写只写,而变量要么全部可见要么全不可见而变量要么全部可见要么全不可见自动属性自动属性classAclassAintlength;intlength;publicintLengthpublicintLengthgetgetreturnlength;returnlength;setsetlength=value;length=value;classAclassA publicintLengthpublicintLengthget;get;set;set;等价1.自动属性不需要创建私有成员2.如果除了简单得读取和赋值还要做起他的操作,必须单独创建访问器索引器索引器n索引器是 C#的简单组件n n索引器通常在包含元素集合的类中定义索引器通常在包含元素集合的类中定义n n为数组创建索引器后,可以通过从类对象指定索引来直接访问数组元素n n可以用索引数组的方式索引对象n n可以像访问数组一样访问类的成员,而不用将内部的细节暴露给用户classIndexerExamplepublicstringstringList=newstring10;publicstringthisintindexgetreturnstringListindex;setstringListindex=value.ToString();classTeststaticvoidMain()IndexerExampleindexTest=newIndexerExample();indexTest.stringList1=Sam;indexTest2=Tom;System.Console.WriteLine(“indexTest1是0nindexTest2是1,indexTest1,indexTest2);定义索引器的规则定义索引器的规则n n必须指定至少一个索引器参数n n应当为索引器参数赋值n n示例:使用索引给学生打分 索引器与数组的比较索引器与数组的比较4-1n n索引器不指向内存位置n n索引器可以有非整数的下标(索引)n n可以重载索引器索引器与数组的比较索引器与数组的比较4-2索引器与数组的比较索引器与数组的比较4-3using System.Collections;using System.Collections;class StrIndexclass StrIndex public Hashtable studentList=new Hashtable();public Hashtable studentList=new Hashtable();public int thisstring name public int thisstring name get get return(int)studentListname;return(int)studentListname;set set studentListname=value;studentListname=value;class Test static void Main()StrIndex objIndex=new StrIndex();objIndexSam=232676;objIndexTom =455464;System.Console.WriteLine(Sam 的电话号码是 0,Tom 的电话号码是 1,objIndexSam,objIndexTom);索引器可以有非整数下标索引器可以有非整数下标而数组不能有而数组不能有 学生通讯录示例学生通讯录示例索引器与数组的比较索引器与数组的比较4-4using System.Collections;using System.Collections;class IndexerExampleclass IndexerExample public string stringList=new string10;public string stringList=new string10;public string thisint index public string thisint index get get return stringListindex;return stringListindex;set set stringListindex=value.ToString();stringListindex=value.ToString();public Hashtable studentList=new Hashtable();public Hashtable studentList=new Hashtable();public int thisstring number public int thisstring number getreturn(int)studentListnumber;getreturn(int)studentListnumber;set set studentListnumber=value;studentListnumber=value;一个类可以有多个索引器一个类可以有多个索引器但必须通过指定不同的但必须通过指定不同的索引类型重载索引器索引类型重载索引器 class Test static void Main()IndexerExample indexTest=new IndexerExample();indexTest.stringList1=Sam;indexTest2=Tom;indexTestSam=232;indexTestTom =455;访问访问stringListstringList 访问访问studentListstudentList 在索引器中使用多个参数在索引器中使用多个参数n n可以指定多个索引器参数编码风格编码风格n n方法应简短,开始给出注释,说明输入、输出参数及其完成的主要功能n n最好含有return语句,但数量不要太多n n采用统一的缩进,良好的可读性LibM完整版完整版
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!