




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章定义类 继承专题 课程回顾 类的定义方法类的定义方法同结构体类似 只是类是使用 class 关键字进行定义的 class 类型名成员名1 类型名成员名2 返回值类型成员函数名 参数列表 课程回顾 类的使用在C 中 我们使用new运算符来创建类的对象 类名对象名 new类名 课程回顾 构造函数构造函数是指在创建类的对象时自动执行的函数 由它负责对类的对象进行初始化 构造函数其实就是定义这样的函数 它的名字与类的名字相同 并且不用定义返回类型 因为构造函数是不能返回值的 构造函数是一种强制性的约定 在创建类的对象时会自动调用它 课程回顾 构造函数的定义 class 参数列表 在这里初始化类的对象 课程回顾 构造函数定义示例 classMyClass publicMyClass Console WriteLine MyClasscreated classProgram staticvoidMain string args MyClassmyClass newMyClass MyClasscreated 课程回顾 带参数的构造函数 classMyClass publicMyClass stringname Console WriteLine Hello 0 name classProgram staticvoidMain string args MyClassmyClass newMyClass somebody Hello somebody 课程回顾 构造函数的重载 classMyClass publicMyClass Console WriteLine Hello publicMyClass stringname Console WriteLine Hello 0 name classProgram staticvoidMain string args MyClassmyClass newMyClass MyClassmyClass newMyClass somebody Hello Hello somebody 课程回顾 构造函数的强制性如果类中定义了构造函数 就必需在创建类的对象时使用适当的参数来调用它 classMyClass publicMyClass stringname Console WriteLine Hello 0 name classProgram staticvoidMain string args MyClassmyClass newMyClass 课程回顾 构造函数的强制性如果类中定义了构造函数 就必需在创建类的对象时使用适当的参数来调用它 classMyClass publicMyClass stringname Console WriteLine Hello 0 name classProgram staticvoidMain string args MyClassmyClass newMyClass test 课程回顾 构造函数总结C 中如果没有定义构造函数则系统会提供一个缺省构造函数 但一旦类中提供了自定义的构造函数 则缺省构造函数将不会被提供 这一点要注意 面向对象的关键特性 继承 继承 这个词的字面含义是 按照法律或遵照遗嘱接受死者的财产 职务 头衔 地位等 面向对象方法中的继承与现实世界中的继承的意义基本相同 是指一个类完全继承了另一个类的所有内容 除私有成员 如字段 成员函数等 继承是一种父母与孩子的关系 孩子从父母那继承了一些父母的特点 并也有着与父母的不同之处 课程内容回顾 继承关系中各类的地位和名称 父类 超类 基类 子类 派生类 我们通常把被继承的类称作基类 而把从基类继承出的新类称作派生类 面向对象的关键特性 继承 继承示例人与学生 教师 士兵之间的继承关系 父类 超类 基类 子类 派生类 课程内容回顾 继承的用法 class 父类定义 class 子类的定义 在定义派生类时 直接在派生类名字的后面跟上冒号并在其后写上基类的名字即可 课程内容回顾 继承使用示例 classBase publicstringBaseString classDerive Base publicstringDeriveString 在这个例子中 基类Base中有一个名为BaseString的字段 而派生类Derive中除含有其自身定义的DeriveString外 还包含从基类中继承来的BaseString字段 课程内容回顾 继承使用示例 BasebaseObj newBase baseObj BaseString SomeString DerivederiveObj newDerive deriveObj DeriveString SomeString 在这里还可以访问基类中定义的字段和方法deriveObj BaseString Some Console WriteLine 0 deriveObj BaseString Console WriteLine 0 baseObj BaseString 注 父类对象却不能调用子类中新增的字段和方法 课程内容回顾 什么是继承继承是指子类自动共享父类的字段和方法的机制 这是类之间的一种关系 在定义和实现一个类的时候 可以在一个已经存在的类的基础之上来进行 把这个已经存在的类所定义的内容作为自己的内容 并加入若干新的内容 派生类从基类继承后 将通过类的继承关系 使基类的公共的特性能够被派生类所共享 提高了软件的重用性 继承 面向对象的关键特性 继承 继承的使用示例 class人 publicstring姓名 publicstring年龄 publicvoid吃饭 食物 食物表 class学生 人 publicstring年级 publicvoid学习 string书名 class教师 人 publicstring所在学校 publicvoid授课 string课程名 面向对象的关键特性 继承 继承的使用示例 classProgram staticvoidMain string args 人张三 new人 张三 姓名 张三 张三 吃饭 new食物 学生李四 new学生 李四 姓名 李四 李四 年级 大二 李四 吃饭 new食物 面向对象的关键特性 继承 继承的使用示例 2 class灯 publicbool打开的 publicvoid开 this 打开的 true publicvoid关 this 打开的 false class可调亮台灯 灯 publicint亮度 publicvoid调亮 this 亮度 publicvoid调暗 this 亮度 面向对象的关键特性 继承 继承的使用示例 2 classProgram staticvoidMain string args 灯普通灯 new灯 普通灯 开 可调亮台灯台灯 new可调亮台灯 台灯 开 台灯 调亮 classA publicinti j publicvoidshowij Console WriteLine iandj 0 1 i j classB A publicintk publicvoidshowk Console WriteLine k 0 k publicvoidsum Console WriteLine i j k 0 i j k staticvoidMain string args AsuperOb newA BsubOb newB superOb i 10 superOb j 20 Console WriteLine 父类的i和j为 superOb showij subOb i 7 subOb j 8 subOb k 9 Console WriteLine 子类的i和j为 subOb showij subOb showk Console WriteLine 子类中i j k的和为 subOb sum 子类B包括它的父类A中的所有成员 这就是为什么subOb可以获取i和j以及调用showij 方法的原因 同样 sum 内部 i和j可以被直接引用 继承的更多内容 找出下例中的问题 classBase publicstringBaseString publicBase stringbaseString BaseString baseString classDerive Base publicDerive Console WriteLine CreateaDeriveclassinstance 继承的更多内容 错误原因分析 子类在创建对象执行构造函数之前会先执行父类中与之匹配的构造函数在本例中publicDerive 子类构造函数与之匹配的基本构造函数应该是 publicBase 而程序中只有publicBase stringbaseString this BaseString baseString 所以错了 修改方法 classProgram staticvoidMain string args Derivecc newDerive classBase publicstringBaseString publicBase publicBase stringbaseString this BaseString baseString classDerive Base publicDerive Console WriteLine CreateaDeriveclassinstance 继承的更多内容 在哪调用基类Base的构造函数 使用base关键字调用基类的构造函数 如下 class public class public base 继承的更多内容 使用base关键字解决之前的问题 classBase publicstringBaseString publicBase stringbaseString this BaseString baseString classDerive Base publicDerive base someString Console WriteLine CreateaDeriveclassinstance 继承的更多内容 在构造基类时 也可以使用派生类构造函数的参数来调用基类的构造函数如 classBase publicstringBaseString publicBase stringbaseString this BaseString baseString classDerive Base publicDerive stringtheString base theString Console WriteLine CreateaDeriveclassinstance 继承的更多内容 staticvoidMain string args stringTheString df TheClassc newTheClass TheString Console WriteLine 0 c TheString classTheClass publicstringTheString publicTheClass stringTheString TheString TheString this的用法 this关键字用来引用类的当前实例 也就是说 在建立对象后 我们就可以使用this来存取此对象 this的作用1 可以用来解决名称相同的问题 限定被相似的名称隐藏的成员 2 将对象作为参数传递到其他方法3 在重载构造函数时 可使用this关键字来调用已有的构造函数 publicclassEmployee publicstringname publicstringalias publicdoublesalary 3000 00 publicEmployee stringname stringalias this name name this alias alias publicvoidprintEmployee Taxt newTax Console WriteLine Name 0 nAlias 1 name alias Console WriteLine Taxes 0 C t CalcTax this publicclassTax publicdoubleCalcTax EmployeeE return 0 08 E salary Main Employeeemp newEmployee jack manager emp printEmployee 继承的更多内容 重载构造函数的相互调用在重载构造函数时 可使用this关键字来调用其他已有的构造函数 注 两个构造函数都会执行 用法如下 class public public this 继承的更多内容 重载构造函数的相互调用在重载构造函数相互调用示例 classTheClass publicstringTheString publicTheClass stringtheString this TheString theString public this none 继承的更多内容 classProgram staticvoidMain string args studentstu newstudent classstudent publicstringname publicintage publicstudent this jack 19 publicstudent stringname intage this name name this age age Console WriteLine 0 1 this name this age 占位符 在现实的生活中有时候需要特殊的表示字符 例如表示货币 时间 那该怎么办呢 不用担心 C 中有格式化标识符C或cCurrency货币格式D或dDecimal十进制格式 十进制整数 不要和 Net的Decimal数据类型混淆了 E或eExponent指数格式 占位符 F或fFixedpoint固定精度格式G或gGeneral常用格式N或n用逗号分割千位的数字 比如1234将会被变成1 234P或pPercentage百分符号格式R或rRound trip圆整 只用于浮点数 保证一个数字被转化成字符串以后可以再被转回成同样的数字X或xHex16进制格式 占位符 staticvoidMain string args inti 12345 Console WriteLine 0 C i 货币Console WriteLine 0 D i 十进制数Console WriteLine 0 E i 科学技术法Console WriteLine 0 F i 浮点数表示法Console WriteLine 0 G i G或gGeneral常用格式Console WriteLine 0 N i N或n用逗号分割千位的数字Console WriteLine 0 X i Console WriteLine 0 P i 继承的更多内容 类型转换 上传到基类对已有基类Base和派生类Derive 可以很容易的把Derive类型转换成Base类型 即可以把Derive类的对象当作Base类的对象来处理 我们称这种转换为上传 转换方法为 派生类对象 new 基类对象 派生类对象 DerivederiveObj newDerive BasebaseObj deriveObj 在这里 由于派生类同时具有基类所有的特性和行为 所以在这里可以直接进行隐式的类型转换 析构函数 析构函数 destructor 与构造函数相反 当对象脱离其作用域时 例如对象所在的函数已调用完毕 系统自动执行析构函数 析构函数往往用来做 清理善后 的工作 例如在建立对象时用new开辟了一片内存空间 应在退出前在析构函数中用delete释放 析构函数的特点 只能对类使用析构函数 一个类只能有一个析构函数 无法重载析构函数 无法调用析构函数 它们是被自动调用执行的 析构函数既没有修饰符 也没有参数 注意 构造函数和析构函数 在继承问题上 执行顺序正好相反 析构函数的声明 类Car的析构函数的声明classCar Car destructor cleanupstatements 程序运行时 有继承关系的类的析构函数将自动被调用 并且是按照从派生程度最大的到派生程度最小的次序调用classFirst First System Console WriteLine First sdestructoriscalled classSecond First Second System Console WriteLine Second sdestructoriscalled classThird Second Third System Console WriteLine Third sdestructoriscalled classTestDestructors staticvoidMain Thirdt newThird C 修饰符 C 修饰符访问控制修饰符 指定类成员的可访问性 public 存取不受限制 private 只有包含该成员的类可以存取 internal 只有当前工程可以存取 protected 只有包含该成员的类以及继承的类可以存取 C 修饰符 相关概念 程序集其实简单地说 程序集就是我们运行编译后产生的dll文件或者exe文件 它里面所包含的MSIL中间代码会在执行的时候 被CLR的JIT编译器根据本特定机器的实际情况进行特定的进一步优化 从而编译成相应的机器码 一个解决方案包括多个项目 一个项目包括多个文件 项目是跟程序集相对应的 一个项目就是一个程序集 访问控制修饰符 访问控制修饰符用来控制类成员的访问级别类成员的访问级别是用来实现面向对象方法中的类的封装性的机制 可用其来隐藏类的内部细节 通过类成员的访问级别 可精确的控制字段或成员函数能被哪些代码所访问 类成员的访问级别有 public 公有的 private 私有的 protected 保护的 internal 内部的 类定义的更多内容 类成员的访问级别public 公有的 可访问级别为公有的属性或成员函数能被任意代码所访问 没有任何限制 classMyClass publicstringName publicvoidPrintName Console WriteLine Hello 0 Name classProgram staticvoidMain string args MyClassmyClass newMyClass myClass Name Sombody myClass PrintName 类定义的更多内容 类成员的访问级别private 私有的 可访问级别为私有的属性或成员函数只能被该类的成员函数所访问 classMyClass privatestringName privatevoidPrintName Console WriteLine Hello 0 Name classProgram staticvoidMain string args MyClassmyClass newMyClass myClass Name Sombody myClass PrintName 类定义的更多内容 类成员的访问级别protected 保护的 可访问级别为保护的属性或成员函数只能被该类的成员函数或子类所访问 classProgram staticvoidMain string args SubClassmyClass newSubClass myClass Name Sombody myClass Test myClass PrintName classBase protectedstringName privatevoidPrintName Console WriteLine Hello 0 Name classSubClass Base publicvoidTest Name 保护成员 Console WriteLine 0 在子类中 Name PrintName 类定义的更多内容 类成员的访问级别internal类型和类型成员的访问修饰符 只有在同一程序集的文件中 内部类型或成员才是可访问的 publicclassProgram staticvoidMain string args SubClassmyClass newSubClass myClass Name Sombody myClass intel internal成员变量可以在类外部使用 myClass Test myClass PrintName Console WriteLine myClass intel publicclassBase protectedstringName internalstringintel publicvoidPrintName Console WriteLine 0 在类的内部使用 Name publicclassSubClass Base publicvoidTest Name 保护成员 Console WriteLine Name PrintName 类定义的更多内容 static使用static修饰符声明属于类本身而不是属于特定对象的静态成员 static修饰符可用于类 方法 属性 运算符 事件和构造函数 但不能用于析构函数或类以外的类型 特点 1 不能通过实例引用静态成员 然而 可以通过类名引用它staticvoidMain string args Console WriteLine MyBaseC x publicclassMyBaseC publicstaticintx 100 2 不可以使用this来引用静态方法或属性 3 如果对类应用static关键字 则该类的所有成员都必须是静态的 4 类和静态类可以有静态构造函数 静态构造函数在程序开始和类实例化之间的某个时刻调用 2 不可以使用this来引用静态方法或属性 staticvoidMain string args MyBaseCc newMyBaseC Console WriteLine MyBaseC x c sum publicclassMyBaseC publicstaticintx 100 publicinty 90 publicvoidsum intz this y Console WriteLine z 3 如果对类应用static关键字 则该类的所有成员都必须是静态的 staticvoidMain string args Console WriteLine MyBaseC x MyBaseC sum publicstaticclassMyBaseC publicstaticintx 100 publicstaticinty 90 publicstaticvoidsum intz y Console WriteLine z 有一个表示公司雇员的类 假设该类包含雇员的基本信息和一个对雇员计数的方法和一个存储雇员总人数的字段 该方法和字段都不属于任何实例雇员 而是属于公司类 因此 应该将它们声明为此类的静态成员 此示例读取新雇员的姓名和ID 将雇员计数器加一 并显示新雇员的信息和新的雇员总人数 为简单起见 该程序从键盘读取当前的雇员数 publicclassEmployee publicstringid publicstringname publicEmployee publicEmployee stringname stringid this name name this id id publicstaticintemployeeCounter 雇员总人数publicstaticintAddEmployee 计算雇员总人数 return employeeCounter classprogram staticvoidMain Console Write Entertheemployee sname stringname Console ReadLine Console Write Entertheemployee sID stringid Console ReadLine Employeee newEmployee name id Console Write Enterthecurrentnumberofemployees stringn Console ReadLine Employee employeeCounter Int32 Parse n Employee AddEmployee Console WriteLine Name 0 e name Console WriteLine ID 0 e id Console WriteLine NewNumberofEmployees 0 Employee employeeCounter abstractabstract修饰符可以和类 方法 属性 索引器及事件一起使用 在类声明中使用abstract修饰符以指示某个类只能是其他类的基类 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现 抽象类 abstract修饰类如果一个类不与具体的事物相联系 而只是表达一种抽象的概念 仅仅是作为派生类的一个基类 这样的类就是抽象类 publicabstractclassoneClass publicinti publicvoiddenylau C 修饰符 抽象类与非抽象类 一般的类 的主要区别 抽象类不能直接被实例化抽象类中可以包含抽象成员 但非抽象类中不可以包含抽象成员抽象类不能被密封 当抽象类派生出子类 非抽象类 时 这些子类 非抽象类 必须具体实现所继承的所有抽象成员 重写抽象成员 C 修饰符 抽象方法在抽象类中声明方法时 如果加上abstract时就是抽象方法特点 1 抽象方法必须声明在抽象类中2 声明抽象方法时 不能使用virtual static private修饰符 3 在抽象类中抽象方法不提供实现 abstractclassShapesClass abstractpublicintArea classSquare ShapesClass intside 0 publicSquare intn side n publicoverrideintArea returnside side staticvoidMain string args Squaresq newSquare 12 Console WriteLine Areaofthesquare 0 sq Area 抽象类的作用 打
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工安全意识不足引发事故应急预案
- 客户访问认证系统故障应急预案
- 十年(2016-2025)高考英语真题分类汇编:专题20 完形填空说明文、议论文(全国)(原卷版)
- 公司内部财务培训课件
- 2025年中小学教育信息化考试试卷及答案
- 2025年消防安全考试试题及答案
- 2025年会计初级考试真题及答案
- 临海职教中心安全培训课件
- 2025年电工操作证复审培训试题及参考答案
- 税法知识竞赛考试题库100题(含答案)
- GB/T 45743-2025生物样本细胞运输通用要求
- 京东方校园2024招聘胜任力测评题库
- 189格林童话-自动上菜的桌子、吐金子的毛驴和自个儿从袋里蹦出来的棒子
- 《绿色建筑概论》整套教学课件
- itop-4412开发板之精英版使用手册
- 建筑设计防火规范2001修订版
- 原料药FDA现场GMP符合性要求与检查实践课件
- 电工基础培训教材课件
- 中国文化概论(第三版)全套课件
- 论语中的孝道课件
- 折彩粽的手工制作ppt公开课
评论
0/150
提交评论