第6章_面向对象程序设计_第1页
第6章_面向对象程序设计_第2页
第6章_面向对象程序设计_第3页
第6章_面向对象程序设计_第4页
第6章_面向对象程序设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第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面向对象的基本概念类和对象属性 方法和事件封装 隐藏细节ClassPerson privatestring no privatestring name publicvoidsetdata stringno stringname no no name name publicvoiddispdata Console WriteLine 0 1 no name 6 1 1面向对象的基本概念继承 实现代码重用classManager Employee 重载和重用重载 publicintMethodTest inti intj publicintMethodTest inti publicstringMethodTest stringstr 6 1 1面向对象的基本概念重载和重写重写 用于实现多态classAnimal publicvirtualstringvoice return 动物的叫声 classDog Animal publicoverridestringvoice return 小狗的叫声 汪汪 classCat Animal publicoverridestringvoice return 小猫的叫声 喵喵 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 3类 6 3 1类的声明类的声明语法格式如下 类的修饰符 class类名 基类名 类的成员 例如 以下声明了一个Person类 publicclassPerson publicintpno 编号publicstringpname 姓名publicvoidsetdata intno stringname pno no pname name publicvoiddispdata Console WriteLine 0 1 pno pname 6 3 2类的成员 6 3 3分部类分部类可以将类 结构或接口等 的声明拆分到两个或多个源文件中 若要拆分类的代码 被拆分类的每一部分的定义前边都要用partial关键字修饰 分部类的每一部分都可以存放在不同的文件中 编译时会自动将所有部分组合起来构成一个完整的类声明 6 4对象 6 4 1定义类的对象一旦声明了一个类 就可以用它作为数据类型来定义类对象 简称为对象 定义类的对象分以下两步 1 定义对象引用其语法格式如下 类名对象名 例如 以下语句定义Person类的对象引用p Personp 2 创建类的实例其语法格式如下 对象名 new类名 例如 以下语句创建Person类的对象实例 p newPersone 以上两步也可以合并成一步 其语法格式如下 类名对象名 new类名 例如 Personp newPerson 理解对象引用和类实例的区别 两个对象引用可以引用同一个对象 例如 Personp1 newPerson Personp2 p1 6 4 2访问对象的字段访问对象字段的语法格式如下 对象名 字段名其中 是一个运算符 该运算符的功能是表示对象的成员 例如 前面定义的p对象的成员变量表示为 p pno p pname 6 4 3调用对象的方法调用对象的方法的语法格式如下 对象名 方法名 参数表 例如 调用前面定义的p对象的成员方法setdata为 p setxy 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 6 6静态成员 6 6 1静态字段静态字段是类中所有对象共享的成员 而不是某个对象的成员 也就是说静态字段的存储空间不是放在每个对象中 而是和方法一样放在类公共区中 对静态字段的操作和一般字段一样 定义为私有的静态字段不能被外界访问 静态字段的使用方法如下 1 静态字段的定义与一般字段相似 但前面要加上static关键词 2 在访问静态字段时采用如下格式 类名 静态字段名 6 6 2静态方法静态方法与静态字段类似 也是从属于类 都是类的静态成员 只要类存在 静态方法就可以使用 静态方法的定义是在一般方法定义前加上static关键字 调用静态方法的格式如下 类名 静态方法名 参数表 注意 静态方法只能访问静态字段 其他静态方法和类以外的函数及数据 不能访问类中的非静态成员 因为非静态成员只有对象存在时才有意义 但静态字段和静态方法可由任意访问权限许可的成员访问 6 7属性 6 7 1什么是属性属性提供了通过访问器 accessor 读 写或计算私有字段值的灵活机制 通过属性用户可以像访问公有成员字段一样来访问类的私有成员字段 6 7 2属性声明其语法格式如下 修饰符数据类型属性名称 get访问器set访问器 其中 修饰符有new public protected internal private static virtual override和abstract 例 publicstringName get returnname set name values 注意 1 当读一个属性的时候 属性的get语句自动执行 当写一个属性的时候 属性的set语句自动执行 2 一个属性中必须有一个get语句或set语句6 7 3属性的种类1 可读写 read write 属性 需实现get和平set访问器2 只读 readonly 属性 只实现get访问器3 只写 write 属性 只实现象set访问器4 Static属性 只能访问静态字段 例6 7 设计一个控制台应用程序 说明属性的使用 usingSystem namespaceProj6 7 publicclassTPoint3 声明类TPoint3 intx y publicintpx get get访问器 returnx set set访问器 x value publicintpy get get访问器 returny set set访问器 y value classProgram staticvoidMain string args TPoint3p newTPoint3 p px 3 p py 8 属性写操作Console WriteLine 点 0 1 p px p py 属性读操作 点 3 8 6 8方法 6 8 1什么是方法方法包含一系列语句的代码块 它实现一定的功能 并拥有一个便于识别的名称 也便于在程序中调用 例 publicintadd intx inty returnx y 6 8 2方法的定义定义方法的基本格式如下 修饰符返回类型方法名 参数列表 方法的具体实现 例 publicintmax intx inty if x y returnx elsereturny 6 8 3方法的参数传递机制C 中方法的参数有4种类型 1 值参数 valueparameter 格式 方法名称 参数类型参数名称 参数类型参数名称 注意 不含任何修饰符 当利用值向方法传递参数时 编译程序给实参的值做一份拷贝 并且将此拷贝传递形参 被调用的方法对形参的改变不会修改实参的值 2 引用型参数 ReferenceParameter 格式 方法名称 ref参数类型参数名称 ref参数类型参数名称 以ref修饰符声明的参数属引用型参数 引用型参数本身并不创建新的存储空间 而是将实参的存储地址传递给形参 所以对形参的修改会影响原来实参的值 在调用方法前 引用型实参必须被初始化 3 输出参数 OutputParameter 格式 方法名称 out参数类型参数名称 out参数类型参数名称 以out修饰符声明的参数属输出参数 与引用型参数类似 输出型参数也不开辟新的内存区域 它与引用型参数的差别在于 调用方法前无需对变量进行初始化 4 向方法传递可变数量的参数为了将方法声明为可以接受可变数量的参数的方法 需使用params关键字 5 数组作为方法的参数 publicclassMyClass6 intnum 10 publicvoidaddnum refintsum paramsint b sum num foreach intiteminb sum item classProgram staticvoidMain string args int a newint 3 1 2 3 intx 0 MyClass6s newMyClass6 s addnum refx a Console WriteLine x 6 9索引器 6 9 1什么是索引器索引器允许类或结构的实例按照与数组相同的方式进行索引 在数组中我们可以通过下标方便地访问数组中的元素 利用索引器可以让我们把对象当成数组一样来方便地访问 即对象能通过下标得到或设置一个值 例 数组int a newint 10 a 1 2 Console WriteLine a 1 类classMyclass Myclassm newMyclass m 0 Console WriteLine m 0 6 9 2定义索引器要声明类或结构上的索引器 需使用this关键字 其语法格式如下 public数据类型this 数据类型index 索引器声明 get和set访问器 其中 this关键字引用类的当前实例 从格式可以看出 索引器与属性类似 都提供了get和set访问器 不同之处在于索引器有参数 因此索引器也称为有参属性 6 9 3索引器与属性的区别1 标识方式属性以名称来标识 索引器则以函数签名来标识 例 publicstringName get set publicstringthis intindxe get set 2 索引器可以被重载 属性不可重载 3 属性可以为静态的 索引器属于实例成员 不能声明为static 6 10委托 6 10 1什么是委托委托声明定义了一种类型 它用一组特定的参数以及返回类型来封装方法 对于静态方法 委托对象封装要调用的方法 对于实例方法 委托对象同时封装一个实例和该实例上的一个方法 6 10 2定义和使用委托定义和使用委托有3个步骤 即声明 实例化和调用 1 声明委托类型声明委托类型就是告诉编译器这种类型代表了哪种类型的方法 使用以下语法声明委托类型 修饰符 delegate返回类型委托类型名 参数列表 例如 publicdelegatevoidmydelegate intn 上述代码声明了一个委托mydelegate 该委托类型可以引用一个采用int作为参数并返回void的方法 2 实例化委托声明了委托类型后 必须创建一个它的实例 即创建委托对象并使之与特定方法关联 publicdelegatevoidmydelegate intn 声明委托类型classmyclass publicvoidfun intn Console WriteLine 0 的2倍 1 n 2 n classProgram staticvoidMain string args myclassobj newmyclass mydelegatep newmydelegate obj fun 实例化委托p 2 调用委托 3 调用委托通过委托对象的名称 后面跟着要传递给委托的参数 放在括号内 调用委托对象 其使用语法格式如下 委托对象名 实参列表 6 10 3委托对象封装多个方法委托对象可以封装多个方法 这些方法的集合称为调用列表 委托使用 和 等运算符向调用列表中增加或移除事件处理方法 6 11事件 6 11 1什么是事件 事件发行者 事件订阅者事件 event 是类在发生其关注的事情时用来提供通知的一种方式 事件发行者 publisher 一个事件发行者 也称作发送者 sender 其实就是一个对象 这个对象会自行维护自身的状态信息 当本身的状态信息发生变动时 便触发一个事件 并通知所有的事件订阅者 事件订阅者

温馨提示

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

评论

0/150

提交评论