版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学习情景7Visual C#面向对象程序设计1面向对象的软件开发技术是当今计算机技术发展的重要成果和趋势之一。C#是完全面向对象的程序设计语言。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点。本讲主要介绍面向对象程序设计中的基本概念和基于C#的面向对象程序设计的方法。8/26/20222C#程序设计实用教程2 7.1 对象和类对象对象是人们要进行研究的任何事物 颜色:灰色排量:3.0 刹车产地:德国行驶名字:保时捷行为状态颜色:红色排量:4.0刹车产地:意大利行驶名字:法拉利行为状态 回顾现实生活中的对象,描述汽车的特征和行为 有各自不同的状态3 7.1类和对象
2、小汽车颜色:灰色排量:3.0 刹车产地:德国行驶名字:保时捷行为状态类的实例化,是由类具体化对象类排量 颜色 行驶 刹车 归纳一组相似对象的共性对象属性方法类描述一组相似对象的共性产地 名字 47.1类和对象-类属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬 吠 57.1 类和对象类:相对对象而言,类似于蓝图包含方法和数据对象:是类的实例使用关键字 new 创建对象具有行为对象厨房起居室浴室书房饭厅储藏室门廊类67.1 类和对象 数据成员成员方法对象:桑塔纳对象特征:黑色 20002.4T 上海大众动态特征:载人抽象实例化类:汽车属性:颜
3、色 型号 马力 生产厂家服务:运输数据值执行的操作类与对象的关系示例77.1 类和对象类:是一种抽象的数据类型,它是所有具有一定共性的对象的抽象。本质上可以认为是对对象的描述,是创建对象的“模板”。类的某一个对象则被称为是类的一个实例,是类的实例化结果。对象类实例化抽象8课堂讨论先有对象还是先有类?应该先定义类才可以从类的定义声明对象。97.2 面向对象语言的特点设计规范 面向对象封装继承多态107.2 面向对象语言的特点-封装 封装,就是对数据的隐藏,封装实现了把数据和操作这些数据的代码(即离散的部件)包装成一个对象,而将数据和操作细节(方法)隐藏起来。私有数据 方法 方法数据对象A对象B公
4、有数据产品封装模块化 信息隐藏 117.2 面向对象语言的特点-继承继承:指面向对象程序的两个类之间的一种关系。 被继承的类叫父类、超类或基类(SuperClass、BaseClass)继承了父类所有属性和方法的类叫子类(SubClass).C#只支持单继承。 继承实现了软件的重用。12 在面向对象技术中,山地自行车、赛车以及串座双人自行车都是自行车类的子类,这个父子关系可以如图所示:自行车(父类)双人自行车子类山地自行车赛车7.2 面向对象语言的特点-继承137.2 面向对象语言的特点-多态 多态是指一个程序中存在着同名的不同方法。在面向对象的程序中多态表现为,可以利用重载在同一类中定义多个
5、同名的不同方法实现多态,也可以通过子类对父类方法的覆盖实现多态。将军对士兵们命令:出发!步兵步行,骑兵骑马将军不必命令:步兵步行出发,骑兵骑马出发147.3 类的定义格式为: 类修饰符 class 类名 :基类类名 类体 关键字合法的标识符属性(变量)方法15例7-1:定义一个车辆类(有两个变量,一个方法) class Vehicle int Passengers; /乘客数 int Gas; /所耗燃料 void Run() /模拟汽车运行 if(Gas0) Gas-=10; else Console.Write(“没有油了,不能再跑了”); 成员变量(字段)成员方法167.3 类的定义在哪
6、儿书写类的代码?与你的源代码文件在一块,同一个命名空间(namespace)下。C#允许在一个类中嵌套另一个类的定义。建议将类书写在另外一个.cs文件中。17C# 中类的定义方法类定义的示例7-3:class 人 /声明字段 public string 姓名; public string 性别; public string 年龄; /声明方法 public void 吃饭(string 食物) Console.Write(姓名+“正在吃:”+食物); 18例如7_2:public class Cuboid / 类名为Cuboid / 声明字段(定义成员变量) private double le
7、ngth; private double width; private double high; public double Cubage() return length*width*high7.3 类的定义声明字段访问控制符类的方法191. 声明字段(成员变量) 与普通变量的声明格式相同。在类体中,字段声明的位置没有特殊要求,习惯上将字段声明在类体中的最前面,以便于阅读。7.3 类的定义20课本实例5-2class Student /字段声明 public string strName; private int nAge; /方法 void pri() Console.Write(姓名为:0
8、,年龄为1,strName,nAge); 217.4 创建类的对象在 C# 中,我们使用 new 运算符来创建类的对象。定义Vehicle类的对象 Vehicle vc=new Vehicle();定义Cuboid类的对象 Cuboid cu=new Cuboid();类名 对象名 = new 类名();实例化对象 实例化对象 22引用对象成员变量的语法形式为: 对象名.成员变量名(成员方法) ;例如:cu.length=2;cu.width=3;cu.high=5;cu.Cubage();访问对象成员 23class Vehicle int Passengers; /乘客数 int Gas;
9、 /所耗燃料 void Run() /模拟汽车运行 if(Gas0) Gas-=10; else Console.Write(“没有油了,不能再跑了”); Vehicle vc=new Vehicle();vc.Passengers=4;vc.Gas=100;vc.Run();为7-1创建对象24为7-2创建对象例如7_2:public class Cuboid / 类名为Cuboid / 声明字段(定义成员变量) double length; public double width; private double high; public double Cubage() return len
10、gth*width*highCuboid cu=new Cuboidcu.length=2;cu.width=3;cu.high=5;cu.Cubage();25课本实例5-2,创建对象class Student /字段 public string strName; public int nAge;public void PintInfo() Console.Write(姓名为:0的学生年龄为:1,strName,nAge); class test static void Main(string args) Student stu = new Student(); stu.strName =
11、张三; stu.nAge=19; stu.PintInfo(); 26创建7-3对象类和对象的例子:人姓名性别年龄吃饭()王秃子:人王秃子男20吃饭()人 王秃子 = new 人();王秃子.姓名 = “王秃子“;王秃子.性别 = “男”;王秃子.年龄 = 20;王秃子.吃饭( “红烧肉”);27 公有成员和私有成员class student public string name;/姓名 private int age; /年龄 private string idNumber ;/身份证号static void Main(string args) student myStudent = new
12、 student(); myS = 张三; myStudent.age = 20; 私有成员 公有成员 实例化一个对象 可以访问 无法访问编译错误 28表7.1 类访问修饰符访问修饰符意 义public(公有)类可以在其他名字空间访问internal(内部)类只能为所在名字空间访问(默认此)(如果引用类库,则不能访问)表7.2成员访问修饰符访问修饰符意 义public(公有)访问不受限制protected(受保护)访问限于所在类和所在类的派生类internal(内部)访问限于所在名字空间内(如果引用类库,则不能访问)private(私有)访问限于所在类。7.3 类的定义2
13、9公有成员和私有成员public (公有级别)定义为公有访问级别的类的成员能够被外界的任何对象访问,没有任何限制。class Person public string Name; / .class Program public static void Main(string args) Person myself = new Person(); myself.Name = “Jiawei”; 30private (私有级别)定义为私有访问级别的类的成员只能被类的成员所访问,而不能被其它对象访问。class Person private string Name; / .class Program
14、 public static void Main(string args) Person myself = new Person(); /! myself.Name = “Jiawei”; 公有成员和私有成员31private (私有级别)正确使用方法class Person private string _name; public void SetName(string name) _name = name; class Program public static void Main(string args) Person myself = new Person(); myself.SetN
15、ame(“Jiawei”); 公有成员和私有成员32课本实例5-3 / / 学生类 / class Student /字段 public string strName; private int nAge; /方法 public void SetAge(int _nAge) this.nAge=_nAge; public int GetAge() return this.nAge; class UseStudent static void Main(string args) Student s = new Student(); s.SetAge(10); Console.WriteLine(s.
16、GetAge(); 337.4 类和类的成员属性class Student private static string strName; private static int nAge; public void SetAge(int _nAge) this.nAge=_nAge; public int GetAge() return this.nAge; 方法 SetAge(Value) 和 GetAge() 分别读取和写入学生 Age Student s; s.SetAge(20); int StuAge= s.GetAge() 每次都调用 GetId() 和 SetId()方法会很繁琐属性
17、347.4 类和类的成员属性class Student public string strName; private int nAge; public string Age get return nAge; set nAge = value; 读取 ID 时调用 将值赋给 ID 时调用 357.4 类和类的成员属性 访问修饰符 数据类型 属性名 get ; set ; 读/写属性可以赋值和检索值367.4 类和类的成员属性访问修饰符 数据类型 属性名get ;只读属性只能检索值377.4 类和类的成员属性访问修饰符 数据类型 属性名set ;只写属性只能赋值387.4 类和类的成员属性属性是“
18、聪明”的字段,“特殊”的方法定义属性类似于定义一个方法,但使用属性时如同使用一个字段class Cat private string name; private int age; static void Main() Cat cat1 = new Cat(); cat1.age = -13; /错误39属性的语法格式为: 访问修饰符 属性名 get /读访问器 /执行体 return ; / 执行体可任写,但须有return 语句。 set /写访问器 /执行体 = value; / 执行体可任写,但须有value值给某字段语句。 7.4 类和类的成员属性407.4 类和类的成员属性示例:pu
19、blic class Cat private int age; public int Age get return age; set if (value=20) 报告出错 else age = value; 417.4 类和类的成员属性示例con6_2:Cat cat1 = new Cat();cat1.Age = 1; /使用Age属性的set访问器int n = Cat.Age; /使用Age属性的get访问器cat1.Age = 100; /收到错误消息42例如7_2(添加属性定义):public class Cuboid / 类名为Cuboid / 声明字段(定义成员变量) priva
20、te double length; private double width; private double high; / 声明属性 public double Length get return length; set length = value; public double Width get return width; set width = value; public double High get return high; set high = value; /声明方法 public double Cubage() return length*width*high7.4 类和类的
21、成员属性数据读取属性名:与字段相关但不同对数据值设置关键字,要写入字段的值43 7.4 类和类的成员属性public class Student int age = 26; / 姓名 private string name; public string Name get return name; set name = value; /问候 public void SayHi() 类的成员字段 属性 方法 类名 447.4 类和类的成员属性如果只提供了get ,没有set ,这样的属性为只读属性如果只提供了set ,没有get ,只写属性优点:属性在使用时类似于类的字段,简单属性在实现时类似于方
22、法,可以编写代码控制用户对数据的存、取,增加安全性检查可以设置只读或只写属性45 7.4 类和类的成员属性private int age; /年龄public int Age get return age; set if (value 0 & value 0 & value 100) age = value; else age = 18; 控制私有字段的可访问性 保护内部数据的安全 建议类内部敏感字段使用属性来控制访问类型可以是各种数据类型,如:对象、数组等等 48 小结编写考试管理系统中的Student类包含的属性年龄(0-100)不符合的设为18姓名(只读属性)爱好(读写)给属性赋值并打印
23、出来497.5类的方法-方法的定义语法访问修饰符(可选),默认情况下为 private访问修饰符 返回类型 (参数列表) / 方法主体如果不需要返回任何值,方法可能返回 void 数据类型方法是类或对象的行为对象需要做某些事情,在类中添加方法方法的定义合法的标识符不能加“;”用逗号隔开变量定义通过return返回值 如果返回类型是void,方法是否需要返回值?50【例5-9】方法的定义。 class Motorcycle public void StartEngine() public void AddGas(int gallons) public int Drive(int miles, i
24、nt speed) return 0; 8/26/202251C#程序设计实用教程517.5 类的方法2. 调用方法 从方法被调用的位置,可以分为在方法声明的类内部调用该方法和在类外部调用方法。内部调用语法格式为: 方法名(参数列表) 在方法声明的类定义外部调用该方法实际上是通过类声明的对象调用该方法,其格式为: 对象名.方法名(参数列表) 52实例6_1:通过调用体积方法来实现计算长方体对象的体积537.5 类的方法-方法的调用【例5-10】方法的调用。Motorcycle moto = new Motorcycle();moto. StartEngine();moto. AddGas(15
25、);moto. Drive(5,20);547.5 类的方法-从方法返回一般来说有两种情况将导致方法返回。(1) 当遇到方法的结束花括号。(2)执行到return语句。有两种形式的return语句:一种用在void方法中(即无需有返回值的方法),另一种用在有返回值的方法中。55【例5-11】通过方法的结束花括号返回。 class MyClass public void myMethod() int i; for (i = 0; i = 5) i = i * 2; Console.WriteLine(i); return; else i = i * 3; Console.WriteLine(i)
26、; return; 8/26/202257C#程序设计实用教程static void Main() MyClass mycls = new MyClass(); mycls.myMethod(); 57使用下述形式的return语句从方法返回一个值给调用者: 格式:return value;【例5-13】通过方法的return语句返回值。class MyClass public int myMethod() int i = 8; if (i = 5) i = i * 2; return i; else i = i * 3; return i; static void Main() MyClas
27、s mycls = new MyClass(); Console.WriteLine(mycls.myMethod(); 8/26/202258C#程序设计实用教程587.5 类的方法-方法的参数在方法的声明与调用中,经常涉及方法参数,在方法声明中使用的参数叫形式参数(形参),在调用方法中使用的参数叫实际参数(实参)。在调用方法时,参数传递就是将实参传递给形参的过程。8/26/202259C#程序设计实用教程597.5 类的方法-方法的参数1. 值参数简单数据类型的参数为值参数,它表明实参与形参之间按值传递。当这个方法被调用时,编译器为值参数分配存储单元,然后将对应的实参的值拷贝到形参中。这种
28、传递方式的好处是在方法中对形参的修改不会影响外部的实参。8/26/202260C#程序设计实用教程605.4.2 方法的参数【例5-14】使用值参数。using System;namespace ValueParameters class MyClass public void S x, int y) int k; k = x; x = y; y = k; 8/26/202261C#程序设计实用教程class Test static void Main() int a = 8, b = 10; Console.WriteLine(a=0,b=1, a, b); MyClass mycls =
29、new MyClass(); mycls.Swap(a, b); Console.WriteLine(a=0,b=1, a, b); 程序的运行结果为:a=8,b=10a=8,b=10617.5 类的方法-方法的参数2. 引用参数用ref修饰符声明的简单数据类型参数为引用参数。引用数据类型作为参数引用参数并不创建新存储单元,它与实参变量同处一个存储单元。因此,对形参的修改就是对实参变量的修改。基本类型参数按引用传递时,实参与形参前均须使用关键字ref。8/26/202262C#程序设计实用教程627.5 类的方法-方法的参数【例5-15】使用引用参数。using System;namespac
30、e ReferenceParameters class MyClass public void S int x, ref int y) int k; k = x; x = y; y = k; 8/26/202263C#程序设计实用教程63 class Test static void Main() int a = 8, b = 10; Console.WriteLine(a=0,b=1, a, b); MyClass mycls = new MyClass(); mycls.S a, ref b); Console.WriteLine(a=0,b=1, a, b); 程序的运行结果为:a=8,
31、b=10a=10,b=88/26/202264C#程序设计实用教程647-6构造函数构造函数是类的一种特殊方法,每次创建类的实例都会调用它。访问修饰符() / 构造函数的主体语法:/ 默认构造函数Student()_class = “信管;示例:65有以下几点特殊性 :构造方法在创建对象时被自动调用。构造方法的方法名与类名相同。没有返回类型和返回值。构造方法可以重载。通常用public修饰7-6构造函数666.3.1 声明构造方法 声明构造方法有两个特别要求: 一是构造方法不允许有返回类型包括void类型二是构造方法的名称必须与类名相同。7-6构造函数67演示:示例 17-6构造函数class
32、 Student private string _name; private char _gender; private string _class; private uint _grade; / 默认构造函数 private Student() _class = “信管; static void Main(string args) / 调用默认构造函数 Student obj = new Student(); Console.WriteLine(“班级= + obj._class); Console.WriteLine(“成绩= + obj._grade); 68长方体类构造方法声明如下:p
33、ublic class Cuboid / 类名为Cuboid / 声明字段(定义成员变量) private double length; private double width; private double high; /声明构造方法 public Cuboid(double l, double w, double h) length = l; width = w; high = h; / 声明属性 public double Length get return length; set length = value; public double Width get return width
34、; set width = value; public double High get return high; set high = value; /声明方法 public double Cubage() return length*width*high697-6构造函数创建对象:Cuboid cubiod = new Cuboid(l,w,h);70 7-6构造函数【例5-5】通过构造函数,实现在产生一个学生对象时为其完成起名工作。using System;namespace Example_Construct / / 学生类 / public class Student public s
35、tring strName;/域 8/26/202271C#程序设计实用教程71 7-6构造函数 / / 构造函数,为学生起名 / public Student(string _strName) this.strName = _strName; class Class1 static void Main(string args) Student s = new Student(张三); Console.WriteLine(s.strName); 8/26/202272C#程序设计实用教程72 例:using System; class MyClass public int x; public
36、Myclass() /类MyClass的构造函数 x=10; class ConsDemo public static void Main() MyClass t1=new MyClass(); MyClass t2=new MyClass(); Console.WriteLine(“0t1”,t1.x, t2.x); 运行结果如下:737-6构造函数-参数化构造函数访问修饰符 / 构造函数的主体语法:(参数列表)/ 参数化构造函数Student(string strclass) _class = strclass;示例:74 构造函数也可以带参数。 例:using System; class
37、 Fruit public string color; public string shape; public Fruit(string c,string s) /类Fruit的构造函数 color=c; shape=s; class Test public static void Main() Fruit Orange=new Fruit(“orange”,”round”);/创建Orange实例 Console.WriteLine(“0,1”,Orange.color, Orange.shape); 运行结果如下:757-6构造函数-参数化构造函数/ 默认构造函数private Stude
38、nt() _class = “信管;/ 参数化构造函数private Employee(string strclass, string strName, char gender, uint grade) _class = strclass; _name = strName; _gender = gender; _grade = grade; public static void Main(string args) / 调用默认构造函数 Student obj = new Student(); / 调用参数化构造函数 Student obj1 = new Student(“信管08“, ”张亮亮
39、“, 男, 98); Console.WriteLine(“默认构造函数输出: n班级=“ + obj._class); Console.WriteLine(“n参数化构造函数输出: n班级= +obj1._class);76析构函数是用于执行清除操作的特殊方法()0 / 析构函数的主体语法: Student()示例:777.7 方法重载6.4.1成员方法重载 方法可以重载,即两个或两个以上方法有相同的名称。重载后的方法被调用时,可根据方法的参数个数、类型来区分应该调用哪个方法。例如能同时处理整型与浮点型数据的重载方法:public void S int a,ref int b)public
40、void S float a,ref float b)78 为什么要重载 public int Sum(int para1, int para2) return para1 + para2; 整形参数,返回值整型如果想让两个string型、两个double型相加,怎么做? 编写两个不同名字的方法,这样我们在进行调用时要先判断是什么类型,能否不判断直接就能相加呢?79 方法的重载同一个类中添加几个名字相同,参数与返回值不同的方法 public string Sum(string para1, string para2) return para1 + para2; public double Su
41、m(double para1, double para2) return para1 + para2; 调用时只要传递参数即可,无需判断类型 80 重载的方式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) public int Sum(int para1, int para2,int para3) 相同类型不同参数个数的重载 不允许重载方法仅
42、仅是返回值不同 817.7方法重载int smallest(int num1, int num2) Console.WriteLine(“0 和 1 相比, 最小的是: , num1, num2); if(num1 num2) return num1; else return num2; int smallest(int num1, int num2, int num3) Console.WriteLine(“0, 1 和 2 相比, 最小的是: , num1, num2, num3); if(num1 num2 & num1 num3) return num1; else if(num2 num1 & num2 num3) return num2; else return num3; 具有不同数量的参数的方法重载82例:方法重载。 using System; class TestoverLoad public void print(int i) Console.Wr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度温室大棚租赁与新能源应用合同3篇
- 二零二五年度美容院品牌合作入股合同范本3篇
- 2025年度传媒公司战略合作伙伴保密协议范本3篇
- 二零二五年度农产品电商平台农产品定制采购合同3篇
- 二零二五年度农村土地流转中介服务合同2篇
- 二零二五年度养老社区入住与养老规划协议3篇
- 二零二五年度军事院校保密协议及教学科研资料保护合同3篇
- 2025年度农村山里墓地买卖合同书2篇
- 2025年度农村土地永久互换与农业生态环境保护合作协议2篇
- 2025年度农村自建房施工建筑垃圾处理与回收利用合同
- YS/T 649-2007铜及铜合金挤制棒
- GB/T 21089.1-2007建筑涂料水性助剂应用性能试验方法第1部分:分散剂、消泡剂和增稠剂
- GB/T 13738.1-2008红茶第1部分:红碎茶
- 工厂5S检查评分评价基准表(全)
- 三年级上册数学教案-3.1 时间的初步认识三(年 月 日-复习课)▏沪教版
- 员工奖惩签认单
- 检验检测服务公司市场研究与市场营销方案
- VDA270气味性测试参考标准中文
- 水泥稳定碎石基层及底基层检验批质量检验记录
- 2022年版课程方案解读及学习心得体会:课程的综合性与实践性
- 2737市场调查与商情预测-国家开放大学2018年1月至2021年7月期末考试真题及答案(201801-202107不少于6套)
评论
0/150
提交评论