基于C#语言进行面向对象编程(一).ppt_第1页
基于C#语言进行面向对象编程(一).ppt_第2页
基于C#语言进行面向对象编程(一).ppt_第3页
基于C#语言进行面向对象编程(一).ppt_第4页
基于C#语言进行面向对象编程(一).ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、第一章 OOP概述、封装,面向对象概述 为什么要使用面向对象的编程 面向对象的基本概念 类视图 构造函数 方法的使用 方法重载 静态方法,本章目标,封装 属性的概念 属性的定义以及用法 枚举 常量 编码规范,本章目标,面向过程式设计,为什么使用面向对象的编程(一),为什么使用面向对象的编程(二),面向过程式设计 自上而下的设计方式:是一个自顶向下,逐步求精的过程; 以main函数概括出整个应用程序需要做的事情,而main函数由对一系列的子函数的调用组成;main中的每一个子函数都可以被精炼成更小的函数。重复这个过程,即可完成一个过程式的设计;特征是以函数为中心,以函数作为划分程序的基本单位,数

2、据往往处于从属地位。 面向过程式设计的优点 易于掌握与理解;符合人们的思维习惯 面向过程式设计的缺点 不能适应问题比较复杂,或者需求经常变化的情况; 数据与操作分离开,对数据与操作的修改变得很困难; 程序架构的依赖关系不合理:main函数依赖于子函数,子函数又依赖于更小的子函数;而子函数往往是细节实现,这些实现是经常变化的,造成的结构就是:程序的核心逻辑依赖于外延的细节,一个细节上的小改动,会引起一系列变动。,对象是人们要进行研究的任何事物,回顾C#的对象,描述汽车的特征和行为,有各自不同的状态,面向对象的基本概念对象,面向对象的基本概念类与对象,小汽车,类的实例化,是由类具体化对象,类,产地

3、,车体颜色,行驶,刹车,归纳一组相似对象的共性,对象,属性,方法,类描述一组相似对象的共性,以下描述中哪个是类,哪个是对象? 1.汽车 2.消防车 3.牌照为“WJ18X6088”的红色消防车,面向对象的基本概念Q ferrari.Run(); /,类,对象,实例化对象,调用方法,public class Student int age = 26; / 姓名 private string name; public string Name get return name; set name = value; /问候 public void SayHi() ,类的成员,字段,属性,方法,类名,面向

4、对象的基本概念类成员,类图,VS2005的类图,类图描述类的结构,查看一个类的类图,“锁”表示私有,不同字段有不同的图标,类图的符号,“-”表示私有 “+”表示公有,“:”后是变量类型,“:”后是返回类型,读懂类图是OOP的基本要求,Student zhang = new Student(); zhang.Name = 张靓靓; zhang.Age = 20; zhang.Hobby = 唱歌歌;,构造方法 一种特别的方法,班级来了新学员 添加学员对象,学员类实例化对象、设置属性,初始属性若太多,设置麻烦,能否在实例化时设置属性?,public Student(string name, int

5、 age, string hobby) this.Name = name; this.Age = age; this.Hobby = hobby; ,Student zhang = new Student(张靓靓, 20, 唱歌歌);,一次设置完成,类中加入这个方法,添加的方法叫做构造函数,构造函数,是类中的一种特殊的方法 构造函数名与类名相同,不返回任何值 可初始化成员变量,class Student public Student(string name, int age, string hobby) this.Name = name; this.Age = age; this.Hobby

6、= hobby; ,初始化成员变量,this 关键字引用类的当前实例,将参数的值,分别赋给当前实例的属性,使用构造函数,new 关键字 可以实例化一个新的对象 指定对某个带参数的构造函数,Student zhang = new Student(张靓靓, 20, 唱歌歌);,每次创建类的实例都会调用此方法,实例化对象调用构造函数,使用 new 关键字,Student scofield = new Student(); Student zhang = new Student(张靓靓, 20, 唱歌歌);,实例化一个对象,实例化一个新对象,在类中使用方法,方法是类或对象的行为 对象需要做某些事情,在

7、类中添加方法 回顾方法的定义,访问修饰符 返回类型 方法名 ( 参数列表 ) / 方法的主体 ,通过return返回值,如果返回类型是void,方法是否需要返回值?,17,静态成员初始化与静态构造函数,根据以下三条规则,指出下面这两段代码输出什么? 创建类的实例或者引用类的任何静态成员才激发静态构造函数; 静态成员初始化语句要先于静态构造函数执行; 静态成员初始化语句与静态构造函数只执行一次。,方法的参数(一),static void Swap(int x,int y) int temp; temp = x; x = y; y = temp; ,static void Main() int n

8、um1 = 100; int num2 = 99; Swap(num1, num2); Console.WriteLine(0:1,num1,num2); ,如何编写交换2个数字的方法?,冒泡排序,小游戏,请 5 位同学上台,在老师的指导下, 按照冒泡排序的算法按身高从低到高排序,冒泡排序,冒泡排序:,每次比较相邻两数 小的交换到前面 每轮结束后最大的数交换到最后,16,25,9,90,23,16,25,9,23,90,9,25,23,第一轮:比较了4次,第二轮:比较了3次,第三轮:比较了2次,第四轮:比较了1次,用二重循环实现冒泡排序,i = 0,i = 1,i = 2,i = 3,第一轮:

9、比较了4次,第二轮:比较了3次,第三轮:比较了2次,第四轮:比较了1次,外层循环,如何用二重循环将5个数字排序?N = 5 5个数字存放在一维数组中 外层循环控制比较多少轮,循环变量 i 内层循环控制每轮比较多少次,循环变量 j,内层循环,循环4次:j 4,循环3次:j 3,循环2次:j 2,循环1次:j 1,i 4,i N-1,j ?,j 4-i,j N-1-i,用二重循环实现冒泡排序,代码框架:,演示示例7:将5个学员成绩排序,使用断点跟踪,for (i = 0; i N-1 ; i+) for (j = 0; j N-1-i ; j+) / 比较 j 和 j+1 位置的元素 / 如果前大

10、后小就交换 ,冒泡排序速记口诀(升序): N 个数字来排队 两两相比小靠前 外层循环 N-1 内层循环 N-1-i,冒泡排序,关键代码分析:,for (i = 0; i scoresj + 1) / 交换元素 temp = scoresj; scoresj = scoresj + 1; scoresj + 1 = temp; ,经过一轮比较交换, 最大的元素换到了最后面,外层循环终止条件:数组长度-1,内层循环终止条件: 数组长度 1 - i,示例7源代码,方法的参数(二),static void Swap(ref int x,ref int y) int temp; temp = x; x

11、= y; y = temp; ,static void Main() int num1 = 100; int num2 = 99; mySwap.Swap(ref num1,ref num2); Console.WriteLine(“0:1”,num1,num2); ,如何保留对方法参数的修改?,对比:参数传递 使用值传递,参数值的更改不能保留 使用ref可以将参数值的更改保留,方法的参数(三),static void GetDay(ref DateTime dtNextDay,out DateTime dtToday) dtNextDay= dtNextDay.AddDays(1);/ 返回

12、该日期的第二天 dtToday = DateTime.Today;/ 返回今天 ,都可以输出结果,ref侧重修改,如何让一个方法返回多个值?,out侧重输出,static void Main() DateTime dtNextDay = new DateTime(2008, 8, 8); DateTime dtToday; GetDay(ref dtNextDay,out dtToday); Console.WriteLine(奥运开幕式后的第二天:0,dtNextDay.ToShortDateString(); Console.WriteLine(今天:0, dtToday.ToShortD

13、ateString(); ,静态方法和实例方法,使用static修饰的方法称为静态方法 使用实例对象调用的方法叫做实例方法,如何在一个类中编码获取该类被实例化的次数(即对象个数)?,为什么要重载?,public int Sum(int para1, int para2) return para1 + para2; ,整形参数,返回值整型,如果想让两个string型、两个double型相加,怎么做?,编写两个不同名字的方法,这样我们在进行调用时 要先判断是什么类型,能否不判断直接就能相加呢?,方法的重载示例,同一个类中添加几个名字相同,参数与返回值不同的方法,public string Sum(

14、string para1, string para2) return para1 + para2; ,public double Sum(double para1, double para2) return para1 + para2; ,调用时只要传递参数即可,无需判断类型,class Add public string Sum(string para1, string para2) public int Sum(int para1, int para2) ,重载的方式,基于不同类型参数的重载,class Add public int Sum(int para1, int para2) pu

15、blic int Sum(int para1, int para2,int para3) ,相同类型不同参数个数的重载,不允许重载方法仅仅是返回值不同,public Student() public Student(string name, int age, string hobby) = name; this.age = age; this.hobby = hobby; ,构造函数的重载,构造函数也可以重载,Student scofield = new Student(); Student zhang = new Student(张靓靓, 20, 唱歌歌);,this表示

16、访问类的成员而不是方法中变量,方法名相同,参数不同,封装 公有成员和私有成员,class student private string name;/姓名 public int age; /年龄 public string idNumber ;/身份证号 static void Main(string args) student myStudent = new student(); myS = 张三; myStudent.age = 20; ,私有成员,公有成员,实例化一个对象,可以访问,无法访问编译错误,封装 数据安全,static void Main(string ar

17、gs) student myStudent = new student(); myStudent.age = -2; myStudent.idNumber = 123456; ,非法数据,身份证号不能被修改,无法获得数据,无法正常赋值,有时候将类中的字段公开是不安全的,如果设为私有成员,能否对这些字段进行规则约束或者只读呢?,封装字段,将类中的字段、属性绑到一起,封装字段,封装是面向对象的三大特性之一,避免非法数据的访问,保证数据的完整性,演示: 在VS中使用重构封装字段,什么是属性,C#程序员不直接访问类的数据 通过访问器访问(get,set),class Student / 姓名 priv

18、ate string name; public string Name get return name; set name = value; ,返回name,get用于获取相应字段的值,set用于设置字段的值,只有get时:只读属性,只有set时:只写属性,get和set都存在:读写属性,属性的类型和字段类型必须一致。,给name赋值,在类中使用属性,private int age; /年龄 public int Age get return age; set if (value 0 ,myStudent.Age = -20; /打印 myStudent.Age = 40; /打印,公开Age

19、,录入非法数据,打印私有变量age,不公开age,通过公有Age访问和约束私有字段age,属性的特点,private int age; /年龄 public int Age get return age; set if (value 0 ,控制私有字段的可访问性,保护内部数据的安全,建议类内部敏感字段使用 属性来控制访问,类型可以是各种数据类型,如:对象、数组等等,如何避免pi在类中被修改?,如果pi在类中被修改了,计算结果错误,public class Compute double pi = 3.14; /计算圆的周长 public double Perimeter(double radiu

20、s) return 2 * pi * radius; /计算圆的面积 public double area(double radius) return pi * radius * radius; ,为什么要使用常量?,常量,常量在使用过程中值不会发生变化 常量程序中反复使用,const 类型 常量名 = 常量值,程序中不会被改变,static void Main(string args) const int PI = 3.14; PI = 3.20; ,强制赋值会发生错误,常量名通常使用大写,什么是枚举?,用一种新的类型定义enum,public enum Genders Male, Fema

21、le / 性别 private Genders gender; public Genders Gender get return gender; set gender = value; ,这样给属性赋值: student.Gender = Genders.Male;,如果这样属性赋值: student.Gender = ACCP;,类型不同不能赋值,性别属性的类型,Genders是一个枚举类型,代码错误,枚举定义,枚举是一组描述性的名称 枚举定义一组有限的值,不能包含方法 对可能的值进行约束 枚举允许描述性名称表示整数值,访问修饰符 enum 枚举名 值1,值2 ,public enum Ac

22、cp S1,S2,Y2 ,我们不会输入S3,Y3,public enum Accp S1=1 ,S2=2 ,Y2=3 / Console.WriteLine(S2的整数值是0.,(int)(Accp.S2);,枚举表示的整数值取得方法,枚举与其它类型的转换,枚举转换为字符串 字符串转换为枚举,public enum Accp S1 ,S2,Y2 / Console.WriteLine(S2的值是0.,Accp.S2.ToString();,(Accp)(Enum.Parse(typeof(Accp),S2);,需要转换的字符串,枚举的特点,汽车类有一个成员是车身颜色,static void M

23、ain(string args) string color = new string red, black, write ; Console.WriteLine(我要选择的颜色是:0,color0); ,使用时,必须了解数组的构成,枚举可以用描述性的名称表示值,使用时无需了解它的构成,private enum color red,write,black static void Main(string args) Console.WriteLine(我要选择的颜色是:0, color.red); ,枚举,枚举的典型应用,DialogResult choice; choice = MessageBox.Show(确定要退出吗?, 退出系统, MessageBox

温馨提示

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

最新文档

评论

0/150

提交评论