已阅读5页,还剩85页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 面向对象编程 目标 面向对象编程OOP编程的相关技术OOP的特征 封装 继承和多态接口 理解面向对象的概念 面向过程在一个结构体中定义窗口的大小 位置 颜色 背景等属性 对窗口操作的函数与窗口本身的定义没有任何关系 如HideWindow MoveWindow MinimizeWindow 这些函数都需要接受一个代表要被操作的窗口参数 是一种谓语与宾语的关系 面向对象定义窗口时 除了要指定在面向过程中规定的那些属性 如大小 位置 颜色 背景等外 还要指定该窗口可能具有的动作 如隐藏 移动 最小化等 这些函数被调用时 都是以某个窗口要隐藏 某个窗口要移动的语法格式来使用的 这是一种主语与谓语的关系 面向对象的三大特征封装 Encapsulation 继承 Inheritance 多态 Polymorphism 类是对某一类事物的描述 是抽象的 概念上的定义 对象是实际存在的该类事物的每个个体 因而也称实例 instance 类与对象 如果将对象比作汽车 那么类就是汽车的设计图纸 所以面向对象程序设计的重点是类的设计 而不是对象的设计 对象 型号 价格 里程 起动 停车 行驶 车轮数量 档的数量 加速 换档 刹车 名称 颜色 品种 摇尾巴 吃东西 犬吠 属性 行为 属性 行为 属性 行为 类 类是一组具有相同数据结构和相同操作的对象的集合 类是对一系列具有相同性质的对象的抽象 是对对象共同特征的描述 语法 访问修饰符 class 类的主体 示例 classEmployee 类的主体 成员变量 成员方法 例如 张三是一个某公司员工对象的话 这个公司所有的员工可以作为一个模板 我们就定义员工这个类 对象和类之间 对象可以是现实生活中的一个物理对象 还可以是某一类概念实体的实例 例如 一辆汽车 一个人 一本书 乃至一种语言 一个图形 一种管理方式 都可以作为一个对象 类是一组具有相同数据结构和相同操作的对象的集合 类是对一系列具有相同性质的对象的抽象 是对对象共同特征的描述 比如每一辆汽车是一个对象的话 所有的汽车可以作为一个模板 我们就定义汽车这个类 可以使用类的定义实例化对象 这表示创建该类的一个实例 从类定义中产生对象 必须有建立实例的操作 类 和 对象 常常混淆 所以从一开始就正确区分它们是非常重要 OOP之封装性 封装性是OOP编程的重要特征 将类进行了封装 对外提供可访问的属性和方法 外部对象必须通过这些属性和方法访问此对象的信息 封装性最主要是访问修饰词来控制 语法 成员变量 访问修饰符 数据类型 成员变量 private protected internal public name status userName int char bool classEmployee privatestring name privatechar gender privateint sex privateuint salary 访问成员变量 步骤1 创建一个类的对象 EmployeeobjEmployee newEmployee 步骤2 使用点号访问成员变量 objEmployee name 张三 objEmployee name M 访问修饰符2 1 Teacher类 private成员 protected成员 public成员 internal成员 Student类 不可访问 不可访问 可以访问 只有Student类在Teacher类都在同一程序集中 才可访问internal成员 访问修饰符2 2 其他类修饰词 字段和属性 保存类的实例的各种数据信息 C 提供了两种方法 字段和属性 通过属性实现了良好的数据封装和数据隐藏 字段 字段表示类或结构中的对象或值字段使类和结构可以封装数据例 publicclassEmployee privatestring name 字段privateuint age 字段 字段设计原则 不要提供公共的或受保护的实例字段对不会更改的常量使用常量字段对预定义对象实例使用公共静态只读字段不要将可变类型的实例指定给只读字段 属性2 1 属性是对现实世界中实体特征的抽象 它提供了对类或对象性质的访问 C 中的属性更充分地体现了对象的封装性 不直接操作类的数据内容 而是通过访问器进行访问 它借助于get和set对属性的值进行读写 属性2 2 属性结合了字段和方法的多个方面例 publicclassEmployee privatestring name 字段privateuint age 字段 publicstringName 属性 可读写 set name value value关键字 传递所赋值get return name publicuintAge 属性 只写 set age value 属性特征 属性使类能够以一种公开的方法获取和设置值 同时隐藏实现或验证代码 get属性访问器用于返回属性值 而set访问器用于分配新值 这些访问器可以有不同的访问级别 value关键字用于定义由set索引器分配的值 不实现set方法的属性是只读的 同样不实现get方法的属性是只写的 除了使用了abstract修饰符的抽象属性 每个访问器的执行体中只有分号 其它所有属性的get访问器都通过return来读取属性的值 set访问器都通过value来设置属性的值 类的继承声明 类B继承类A classA classB A 如果还有接口IFace1 IFace2需要实现 classB A IFace1 IFace2 对象的生命周期 每个对象都有一个明确定义的生命周期 除了 正在使用 的正常状态之外 还有两个重要的阶段 构造阶段析构阶段 构造函数2 1 构造函数是类的一种特殊方法 每次创建类的实例都会调用它 访问修饰符 构造函数的主体 语法 publicclassEmployee 默认构造函数Employee qualification 研究生 示例 staticvoidMain string args 调用默认构造函数EmployeeobjEmployee newEmployee Console WriteLine 资格 objEmployee qualification Console WriteLine 薪水 objEmployee salary 构造函数2 2 classEmployee privatestring name privatechar gender privatestring qualification privateuint salary 默认构造函数privateEmployee qualification 研究生 参数化构造函数2 1 访问修饰符 构造函数的主体 语法 参数列表 参数化构造函数Employee stringstrQualification qualification strQualification 示例 构造函数3 1 是类中的特殊类型的方法是每次创建对象时要调用的函数通常用于初始化与类同名不返回值 构造函数3 2 usingSystem publicclassDaysInYear privateintdays publicDaysInYear days 365 staticvoidMain String args DaysInYearnewDaysInYear newDaysInYear Console WriteLine newDaysInYear days 无构造函数输出的结果是0 有构造函数输出结果是365 带参数的构造函数3 3 publicclassDaysInYear privateintdays publicDaysInYear days 365 publicDaysInYear intday days day publicDaysInYear StringdayOne days Convert ToInt32 dayOne publicvoidsetDay intnewDays days newDays 传递不同个数的参数传递个数相同但类型不同的参数 析构函数 是用于执行清除操作的特殊方法 析构函数的主体 语法 Employee 示例 析构函数特征 不能在结构中定义析构函数 只能对类定义析构函数 一个类只能有一个析构函数 无法继承或重载析构函数 无法调用析构函数 它们是被系统调用的 析构函数既没有修饰符 也没有参数 方法 接听 响铃 挂断 PickUp 用于传送和接收信号的代码 Ring 用于显示主叫号码的代码 Hang 用于结束会话的代码 对象的行为 声明方法2 1 语法 访问修饰符 可选 默认情况下为private 访问修饰符 返回类型 参数列表 方法主体 如果不需要返回任何值 方法可能返回void数据类型 声明方法2 2 classPoint intx inty voidAssign System Console WriteLine 输入点的值 x int Parse System Console ReadLine y int Parse System Console ReadLine 方法Assign 的定义 不返回任何值 void 不接收任何值 Assign Assign 方法 调用方法2 1 对象名 方法名 参数列表 实例 类中的方法 点号 语法 调用方法2 2 return 表达式 return语句 Numbernum newNumber intresult num Sum 10 31 publicclassNumber publicintSum intx inty ints x y returns 语法 方法的参数 C 中方法的参数有四种类型 值参数 不含任何修饰符 引用型参数 以ref修饰符声明 输出参数 以out修饰符声明 数组型参数 以params修饰符声明 值参数 当利用值向方法传递参数时 编译程序给实参的值做一份拷贝 并且将此拷贝传递给该方法 被调用的方法不会修改内存中实参的值 所以使用值参数时 可以保证实际值是安全的 参见教材中示例7 7 引用型参数 引用型参数和值参不同 引用型参数并不会开辟新的内存区域 当利用引用型参数向方法传递形参时 编译程序将把实际值在内存中的地址传递给方法 引用型参数一般是两种情况下存在方法的形参本身就是引用类型 参见示例7 8通过声明ref关键字使参数按引用传递参见示例7 9 输出参数 与引用型参数类似 输出型参数也不开辟新的内存区域 与引用型参数的差别在于 调用方法前无需对变量进行初始化 输出型参数用于传递方法返回的数据 out修饰符后应跟随与形参的类型相同的类型声明例 staticvoidSplitPath stringpath outstringdir outstringname 示例参见书中例7 10 数组型参数 形参表中包含了数组型参数 那么它必须在参数表中位于最后 params关键字可以指定在参数数目可变处采用参数的方法参数 在方法声明中的params关键字之后不允许任何其他参数在方法声明中只允许一个params关键字 示例参见书中例7 11 this关键字 this仅限于在构造函数 类的方法和类的实例中使用 在类的构造函数中出现的this作为一个值类型 它表示对正在构造的对象本身的引用 在类的方法中出现的this作为一个值类型 它表示对调用该方法的对象的引用 在结构的构造函数中出现的this作为一个变量类型 它表示对正在构造的结构的引用 在结构的方法中出现的this作为一个变量类型 它表示对调用该方法的结构的引用 经常在构造函数或者类方法中 如果传入参数和类字段同名 一定需在类字段前加上this this示例 usingSystem classA privateintx publicA intx this x x publicvoidPrintX x 5 Console WriteLine Thevalueofxis 0 x Console WriteLine Thevalueofthis xis 0 this x publicstaticvoidMain Aa newA a PrintX 静态成员和非静态成员 将类中的某个成员声明为static 该成员称为静态成员 类中的成员要么是静态 要么是非静态的 静态成员是属于类所有的 非静态成员则属于类的实例 对象 静态示例 usingSystem classStaticSample intx staticinty voidF x 1 正确 等价于this x 1y 1 正确 等价于Test y 1 staticvoidG x 1 错误不能访问this xy 1 正确 等价于Test y 1 staticvoidMain StaticSamplet newStaticSample t x 1 正确 t y 1 错误不能在类的实例中访问静态成员 StaticSample x 1 错误不能按类访问非静态成员StaticSample y 1 正确 常量 访问修饰词 const数据类型常量名 一般大写 数值例 classA publicconstdoubleX 1 0 publicconstdoubleY 2 0 publicconstdoubleZ 3 0 用一条语句同时声明多个常量 上例可写成 classA publicconstdoubleX 1 0 Y 2 0 Z 3 0 方法重载 重载方法有两种方式指定不同个数的参数指定不同类型的参数 不同参数个数的方法重载 usingSystem publicclassArea privateintareaVal publicvoidAreaCal intradius areaVal 22 7 radius radius publicvoidAreaCal intlength intbreadth areaVal length breadth publicvoidAreaCal intlength intbreadth intheight areaVal length breadth height 参数的类型相同参数个数不同 不同参数类型的方法重载 publicvoidAreaCal intradius areaVal 22 7 radius radius publicvoidAreaCal stringshapeName Console WriteLine 0 的面积没有计算 shapeName 方法中参数个数相等 参数类型不同 索引器 索引器是C 的简单组件为数组创建索引器后 可以通过从类对象指定索引来直接访问数组元素可以用索引数组的方式索引对象可以像访问数组一样访问类的成员示例 定义索引器的规则 必须指定至少一个索引器参数应当为索引器参数赋值 索引器与数组的比较4 1 索引器不指向内存位置索引器可以有非整数的下标 索引 可以重载索引器 索引器与数组的比较4 2 索引器与数组的比较4 3 usingSystem Collections classStrIndex publicHashtablestudentList newHashtable publicintthis stringname get return int studentList name set studentList name value classTest staticvoidMain StrIndexobjIndex newStrIndex objIndex Sam 232676 objIndex Tom 455464 System Console WriteLine Sam的电话号码是 0 Tom的电话号码是 1 objIndex Sam objIndex Tom 索引器可以有非整数下标而数组不能有 索引器与数组的比较4 4 usingSystem Collections classIndexerExample publicstring stringList newstring 10 publicstringthis intindex get returnstringList index set stringList index value ToString publicHashtablestudentList newHashtable publicintthis stringnumber get return int studentList number set studentList number value classTest staticvoidMain IndexerExampleindexTest newIndexerExample indexTest stringList 1 Sam indexTest 2 Tom indexTest Sam 232 indexTest Tom 455 一个类可以有多个索引器但必须通过指定不同的索引类型重载索引器 在索引器中使用多个参数 可以指定多个索引器参数 接口中的索引器 索引器可在接口 interface 上声明 接口索引器的访问器与类索引器的访问器具有以下方面的不同 1 接口访问器不使用修饰符 2 接口访问器没有体 因此 访问器的用途是指示索引器是读写 只读还是只写 例 publicinterfaceISomeInterface stringthis intindex get set 索引器的设计原则 考虑使用索引器提供对存储在内部数组中的数据的访问 考虑对表示项的集合的类型提供索引器 避免使用具有多个参数的索引属性 如果一个索引器需要多个参数 请重新评估该属性是否确实表示对逻辑集合的访问 如果不是 则改用方法 并考虑选择以Get或Set开头的方法名 避免为索引器设置除System Int32 System Int64 System String System Object 枚举或泛型类型参数之外的其他参数类型 不要同时提供在语义上等效的索引器和方法 注意 不要在一个类型中提供一组以上的重载索引器 总结 类的声明类的成员类的构造函数和析构函数方法静态成员字段和属性索性器以及设计原则 OOP之继承 继承是OOP最重要的特征之一任何类都可以从另一个类中继承 这就是说 这个类拥有它被继承的类的所有成员 在OOP中 被继承 也称为派生 的类称为父类 也称为基类 继承可以从一个较一般的基类扩展或创建更多的特定类 继承是软件重用的一种形式 类继承结构图 一学校相关人员的类继承结构图 目标 继承的类型继承的实现修饰符接口继承 体验 程序运行时实现老虎 鹰 鲨鱼三个对象 分别调用它们的一个方法 继承3 1 ClassBase 成员变量intbasevar 成员函数Base fun1 定义 基类 voidmain Derivedobjdr newDerived objdr Base fun1 派生类 狗 猪 继承3 2 动物 基类 派生类 继承的层次结构示例 继承3 3 ClassAnimal 成员变量inteyes nose Animal eyes 2 nose 1 Pet Animal 定义 基类 ClassDog Animal 成员变量 成员函数privateBarking 定义 privateWagging Tail 派生类 继承C 中的类 publicclassGraduate Student Employee 成员变量 成员函数 多重继承 允许多重接口实现 不能多重继承 用于从派生类中访问基类成员可以使用base关键字调用基类的构造函数 关键字base 调用base构造函数 publicclassTeacher Person privateuintid 调用Teacher构造函数publicTeacher stringname uintage uintid base name age this id id Console WriteLine id base关键字将调用Person类构造函数 示例 publicclassPerson publicstring name publicuint age publicPerson stringname uintage this name name this age age Console WriteLine name Console WriteLine age publicclassTeacher Person privateuint id publicTeacher stringname uintage uintid base name age this id id Console WriteLine id staticvoidMain string args 构造StudentTeacherobjt newTeacher 张三 32 003 关键字override ClassDerived Base 成员变量intderivedvars 成员函数overrideFunc1 定义 基类 派生类 ClassBase 成员变量intbasevar 成员函数Func1 定义 关键字virtual Accessmodifier virtual returntype name parameters list Virtual方法实现 publicvirtualvoidFunc Console WriteLine 这是virtual方法 可以在派生类中被重写 抽象类 抽象类也必须为在该类的基类列表中列出的接口中所有成员提供它自己的实现 允许抽象类将接口方法映射到抽象方法上 interfaceIMethods voidF voidG abstractclassC IMethods voidIMethods F FF voidIMethods G GG protectedabstractvoidFF protectedabstractvoidGG interfaceIMethods voidF voidG abstractclassC IMethods publicabstractvoidF publicabstractvoidG 抽象类和抽象方法2 1 abstractclassClassOne 类实现 不能实例化派生类的基类 abstractclassBase 成员变量intbasevar 成员函数abstractvoidbase fun1 parameters 无法实现 classDerived Base 成员变量intderivedvars 成员函数overridevoidBase fun1 parameters 实际实现 抽象类 派生类 抽象类和抽象方法2 2 总结 继承的类型继承的实现修饰符接口继承 接口 接口是把隐式公共方法和属性组合起来 是封装特定功能的一个集合 接口不能单独存在 不能像实例化一个类那样实例化接口 接口不能包含实现其成员的任何代码 而只能定义成员本身 实现过程必须在实现接口的类中实现 一个类可以支持多个接口 多个类也可以支持相同的接口 目标 接口的声明接口的成员接口的实现接口的继承抽象类 体验 设计主板 网卡 声卡三个类和一个PCI接口 通过它们的对话说明接口的作用和功能 接口声明 访问修饰符 interface 声明主体 例 interfaceIControl voidPaint 接口成员2 1 接口的成员包括从基接口继承的成员和由接口本身声明的成员 接口的成员必须是方法 属性 事件或索引器 接口不能包含常量 字段 运算符 构造函数 析构函数 也不能包含任何种类的静态成员 接口成员2 2 所有接口成员都隐式地具有public访问属性 接口成员声明中包含任何修饰符都属于编译时错误 例 publicdelegatevoidStringListEvent IStringListsender publicinterfaceIStringList voidAdd strings 方法intCount get 属性eventStringListEventChanged 事件stringthis intindex get set 索引器 接口实现 接口可以由类和结构来实现为了指示类或结构实现了某接口 在该类或结构的基类列表中应该包含该接口的标识符 例 interfaceICloneable objectClone interfaceIComparable intCompareTo objectother classListEntry ICloneable IComparable publicobjectClone publicintCompareTo objectother 接口成员访问 接口成员是通过I M形式的成员访问表达式和I A 形式的索引器访问表达式来访问的 其中I是接口类型 M是该接口类型的方法 属性或事件 A是索引器参数列表 多义性2 1 对于多重继承接口 当两个或更多个不相关 互不继承 的基接口中声明了具有相同名称或签名的成员时 就会发生多义性 在所有情况下 都可以使用显式强制转换来解决这种多义性 例 多义性2 2 interfaceIInteger voidAdd inti interfaceIDouble voidAdd doubled interfaceINumber IInteger IDouble classC voidTest INumbern n Add 1 n Add 1 0 IInteger n Add 1 IDouble n Add 1 同名方法声明 接口继承2 1 接口可以实现继承 而且还可以实现多重继承 例 interfaceIBase voidF inti interfaceILeft IBase newvoidF inti interfaceIRight IBase voidG interfaceIDerived ILeft IRight classA voidTest IDerivedd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设备突发事故应急预案(3篇)
- 小商铺营销方案(3篇)
- 殡葬产品营销方案(3篇)
- 辽宁锦州市2026届高三下学期质量检测(一)语文试题及参考答案
- 学校少先队工作计划(2篇)
- 网络安全与数据保护-第4篇
- 网络分组算法分析
- 深圳航空公司空勤人员职业压力剖析与应对策略探究
- 深冷环境下压力容器用奥氏体不锈钢拉伸力学性能研究
- 淡水生态系统中多种污染物相对风险排序方法及其实践应用研究
- (2026年)世界哮喘日:让每位哮喘患者都能获得抗炎吸入剂-这仍是当务之急课件
- 雨课堂学堂在线学堂云《Age of Sustainable Development(SDG Academy)》单元测试考核答案
- 皖2015s209 混凝土砌块式排水检查井
- 孙桓《机械原理》(第9版)笔记和课后习题(含考研真题)详解
- 条件概率公开课一等奖市赛课获奖课件
- GB/T 30029-2023自动导引车设计通则
- 护理学导论-第二章-健康与疾病
- YC/Z 575-2018打叶复烤初烤烟选叶指南
- JJG 52-2013弹性元件式一般压力表、压力真空表和真空表
- GB/T 1981.2-2003电气绝缘用漆第2部分:试验方法
- 南瑞继保后台监控使用厂家培训版本电子版本
评论
0/150
提交评论