版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,面向对象程序设计,第7章,7.1 面向对象程序设计思想,7.3 类与对象,7.2 面向对象的基本概念,7.4 方法与属性,7.5 继承,7.6 多态,7.7一个面向对象程序设计例子,7.1 面向对象程序设计思想,面向对象程序设计遵循人类认识客观事物的一般规律,去分析、设计和实现一个软件系统。强调以问题域中存在的对象为中心,通过对象间的相互作用给出问题的解。,面向对象程序设计认为: (1)客观世界由对象组成,对象是构成客观世界的基本单位。 (2)每个对象都具有各自的内部状态和运动规律,通过与外界环境和其它对象的交互,可以改变对象的状态,以及做出各种反应,体现了对象的封装性与隐蔽性。,(3)相近
2、或相同的对象可划分为一类。类与对象之间的关系是抽象与具体的关系,类是对象的抽象,对象是类的实例。 (4)通过继承,可以形成类之间的层次关系。 (5)简单对象可以组合成复杂对象。 (6)对象之间通过发送消息进行联系。 (7)不同对象组合起来,并通过对象间的相互作用可以构成各种系统。,综上所述,面向对象程序设计可以描述为: 面向对象 = 对象 + 类 + 继承 + 消息,7.2 面向对象的基本概念,客观世界中的任何事物都可以看作是对象,例如一个叫张生的学生,1.对象与类,对象是属性与操作的封装体。每个对象利用属性描述其静态特征。同时,对象利用操作来描述其动态特征(或行为),类是对一组具有相同特征和
3、行为的对象的抽象。它抽象地描述了属于该类的全部对象的属性和操作。例如学生都具有学号、姓名、年龄等属性,同时又具有学习、运动、听课等操作,1.对象与类,类与对象之间的关系是抽象与具体的关系。类是一组对象的抽象,对象是类的实例。,消息是指一个对象向另一个对象所发出的请求。在两个对象中,发送消息的对象称为消息发送者,接收消息的对象称为消息接收者。,2.消息,消息传递对应对象的方法调用,即消息发送者调用消息接收者的某个方法。,抽象是指仅研究事物的本质的、主要的方面,而忽略非本质的、次要的方面。例如城市地图,3.抽象与封装,封装就是将数据的表现方式和对数据的操作细节隐藏起来,用户可以通过接口对数据进行操
4、作,而不必要知道数据是如何表示的、怎么对数据操作的这些细节。例如,汽车,继承表示类之间存在一种一般与特殊的关系,这种关系使得某类对象可以继承另外一类对象的特征。 表示一般的类称为基类或超类,表示特殊的类称为派生类或子类。 派生类继承了基类的所有特征,同时又可以加入自己的特征。,4.继承,多态性是指不同对象收到相同消息时,会产生不同动作。从而实现“一个接口,多种方法”。,5.多态,比如,向MP3发送“播放”消息,它会播放音乐,而向DVD发送“播放”消息,它会播放电影。,7.3 类与对象,1. 定义类,7.3.1 类,定义格式为: class 类名 类体 ,【例7.1】定义一个类,用于描述平面上的
5、点,class Point private int x; private int y; public Point(int a, int b) x = a; y = b; public void Display() Console.WriteLine(点的坐标:(0,1), x, y); ,类的成员包括数据成员和成员函数两类。,2. 类的成员,数据成员是指类的对象所包含的数据,可以是常量,也可以是变量。在C#中,类中定义的变量又称为字段。 成员函数是指包含可执行代码的成员,用于对类的数据成员进行操作。类的成员函数包括方法、属性、构造函数等。,【例7.2】 定义时间类,class Time pri
6、vate int hour, minute, second; public void AdjustHour(int h) hour = h; public void AdjustMinute(int m) minute = m; public void AdjustSecond(int s)second = s; public void DisplayTime() Console.WriteLine(北京时间:0:1:2, hour, minute, second); ,【例7.2】 定义时间类,class Program static void Main(string args) Time
7、time = new Time(); time.AdjustHour(15); time.AdjustMinute(20); time.AdjustSecond(45); time.DisplayTime(); Console.Read(); ,通过设置成员的访问控制(可见性),可以实现类的封装。,3.成员的访问控制,访问控制为公有的成员,形成类的接口,允许外部通过该接口访问类的内部;访问控制为私有的成员,被封装在类的内部。,在C#中,使用访问修饰符public、private、protected和internal设置成员的访问控制。,3.成员的访问控制,【例7.3】定义日期类,class D
8、ate private int year, month, day; public Date(int y, int m, int d) year = y; month = m; day = d; public void AdjustYear(int y) if (y = 1900) year = y; public void DisplayDate() Console.WriteLine(当前的日期为0年1月2日, year, month, day); ,【例7.3】定义日期类,class Program static void Main(string args) Date date = new
9、 Date(2008, 8, 8); date.Display(); /date.year = 2011; /错误 date. AdjustYear(2011); date. AdjustMonth(1); date. AdjustDay(1); date.DisplayDate(); Console.Read(); ,1. 创建对象,7.3.2 对象,类名 对象名 = new 类名(参数); 例如: Time time = new Time(13, 29, 35); 或者: Time time; time = new Time(13, 29, 35);,构造函数是一类特殊的成员函数,它主要用
10、于为对象分配空间,完成对象的初始化工作。,构造函数,构造函数的格式: 访问修饰符 函数名(形参列表) 函数体 例如: public Time(int h, int m, int s) hour = h;minute = m;second = s;,构造函数特殊性:,构造函数的名字必须与类名相同; 构造函数可以带参数,用于为类数据成员赋初值 构造函数没有返回值,不能有return语句; 构造函数在创建对象时被自动调用,不需要在程序中显式调用; 如果没有给类定义构造函数,则编译系统会自动生成一个默认构造函数,其形式为: public 构造函数名() : base() 构造函数可以被重载,但不可以被
11、继承。,【例7.4】 带有构造函数的出版物类,class Publish protected string name,publisher; protected DateTime date; public Publish(string n, string p, DateTime d) name = n; publisher = p; date = d; public void ModifyDate(DateTime d) date = d; public void Display() Console.WriteLine(出版物0的出版单位为1、出版日期为2, name, publisher, d
12、ate.ToLongDateString(); ,【例7.4】 带有构造函数的出版物类,class Program static void Main(string args) Publish pub = new Publish(百科全书, 大百科出版社, DateTime.Now); pub.Display(); pub.ModifyDate(DateTime.Now.AddDays(5); pub.Display(); Console.Read(); ,类的析构函数完成销毁对象的任务。,2. 销毁对象,析构函数格式: 析构函数名() 函数体 例如: Publish () ,【例7.5】带有构
13、造函数和析构函数的课程类,class Course private int courseNO,grade; private string courseName; public Course(int no, string name, int score) courseNO=no; courseName=name; grade=score; Console.WriteLine(.调用构造函数,对象生命周期开始.n); Course() Console.WriteLine(.调用析构函数,对象生命周期结束.n); public void Display() Console.WriteLine(0课程
14、的课程号为:1t学分为:2n, courseName, courseNO, grade); ,【例7.5】带有构造函数和析构函数的课程类,class Program static void Main(string args) Course computer; computer = new Course(123, 面向对象程序设计, 4); computer.Display(); ,对象遵循先创建后使用的原则。,3. 使用对象,对象中的成员的访问格式: 对象.数据成员 对象.成员函数(实参列表) 例如: Course computer = new Course(123, 面向对象程序设计, 4)
15、; computer.Display();,【例7.6】使用苹果对象,class Apple private double amount; private double price; public Apple(double a, double p) amount = a; price = p; public void Sell(double s) if (amount = s) amount -= s; else amount = 0; public double GetAmount() return amount; ,【例7.6】使用苹果对象,class Program static voi
16、d Main(string args) Apple ap = new Apple(100, 4.5); Console.WriteLine(库存苹果:0公斤, ap.GetAmount(); ap.Sell(32.5); Console.WriteLine(库存苹果:0公斤, ap.GetAmount(); ap.Sell(82.5); Console.WriteLine(库存苹果:0公斤, ap.GetAmount(); Console.Read(); ,7.4 方法与属性,方法是表现类或对象行为的成员函数,是完成特定功能的语句集合。,7.4.1 方法,方法声明的具体格式为: 方法修饰符 返
17、回类型 方法名(形参列表) 方法体 ,【例7.7】计算圆的面积与周长,class Circle private int x, y; private double radius; public Circle(int px, int py, double r) x = px; y = py; radius = r; public double GetArea() return Math.PI * radius * radius; public double GetPerimeter() return 2 * Math.PI * radius; ,【例7.7】计算圆的面积与周长,class Prog
18、ram static void Main(string args) Circle c = new Circle(10, 20, 10); Console.WriteLine(圆的面积为:0:f2, c.GetArea(); Console.WriteLine(圆的周长为:0:f2, c.GetPerimeter(); Console.Read(); ,属性用来刻画对象的特征或表示对象的状态。 属性把读取和修改对象特征的操作与程序代码关联起来。,7.4.2 属性,定义属性的语法格式: 访问修饰符 数据类型 属性名 get get访问器代码块 set set访问器代码块 ,获取属性值必须使用get
19、访问器。get访问器通过return语句返回属性的值; 给属性赋值必须使用set访问器,set访问器使用value关键字设置属性的值。,2.访问属性,属性不必要同时拥有get和set访问器。,【例7.8】书籍列表,class Book private long isbn; private string bookName; private decimal price; public Book(long no, string name, decimal p) isbn = no; bookName = name; price = p; public long Isbn get return isb
20、n; public decimal Price get return price; set if (value 0) price = value; public string Display() return String.Format( BookName-0tISBN-1tPrice-2元, BookName, Isbn, Price); ,【例7.8】书籍列表,class Program static void Main(string args) Book ComputerBook=new Book(111,程序设计,23); Console.WriteLine(ComputerBook.
21、Display(); Book EnglisBook = new Book(222,大学英语,35); Console.WriteLine(EnglisBook.Display(); EnglisBook.BookName = 大学物理; Console.WriteLine(EnglisBook.Display(); EnglisBook.Price = -5M; Console.WriteLine(0书的价格为:1元, EnglisBook.BookName, EnglisBook.Price);,7.5 继承,使用继承,可以使派生类拥有基类的公有成员和保护成员,同时派生类还可以定义自己的成
22、员,以及重新定义基类的一些成员。,派生类具有两个有效类型: 新类的类型; 继承的类的类型。,定义派生类的格式: 类修饰符 class 类名 :基类 类体 ,7.5.1 定义派生类,【例7.9】在例7.4的Publish类的基础上,定义派生类Book,class Publish protected string name, publisher; protected DateTime date; public Publish(string n, string p, DateTime d) name = n; publisher = p; date = d; public void ModifyDa
23、te(DateTime d)date = d; public void Display() Console.WriteLine(出版物0的出版单位为1、出版日期为2, name, publisher, date.ToLongDateString(); ,【例7.9】在例7.4的Publish类的基础上,定义派生类Book,class Book : Publish private string author, isbn; private int amount; public Book(string na, string pub, DateTime da, string au, string is
24、b, int am) : base(na, pub, da) author = au; isbn = isb; amount = am; public void Print() Console.WriteLine(0的出版单位为1、出版日期为2n作者为3、ISBN号位4, name, publisher, date.ToLongDateString(), author, isbn); ,【例7.9】在例7.4的Publish类的基础上,定义派生类Book,class Program static void Main(string args) Book ComputerBook = new Bo
25、ok(程序设计,科学出版社,new DateTime(2010,3,23),浩南,969-5-123-45897-9,3000); ComputerBook.Print(); Book EnglisBook = new Book(大学英语,外国语出版社, new DateTime(2008, 2, 12), 贾家, 369-9-156-45789-3, 2000); EnglisBook.Print(); ,派生类构造函数的一般格式: 派生类构造函数名(派生类参数列表) : base(基类参数列表) 初始化语句 ,7.5.2 派生类的构造函数,生成派生类对象时,构造函数的执行顺序: 首先执行基
26、类的构造函数,然后再执行派生类的构造函数。,【例7.10】派生类构造函数的执行顺序,class Fruit protected string name, place; protected int rank; public Fruit(string na, string pl, int ra) name = na;place = pl; rank = ra; Console.WriteLine(-Fruit的构造函数被调用-); public void Display() Console.WriteLine(0的产地是1,等级是2, name, place, rank); ,【例7.10】派生类
27、构造函数的执行顺序,class Apple : Fruit private double amount, price; public Apple(string na, string pl, int ra, double am, double pr) : base(na, pl, ra) amount = am; price = pr; Console.WriteLine(-Apple的构造函数被调用-); public void Sell(double s) if (amount = s) amount -= s; else amount = 0; public void Print() Co
28、nsole.WriteLine(0的产地是1,等级是2级,单价是3元,数量是4公斤, name, place, rank, price, amount); ,【例7.10】派生类构造函数的执行顺序,class Program static void Main(string args) Apple ap = new Apple(苹果,河北省,2,100,4.5); ap.Print(); ap.Sell(32.5); ap.Print(); ap.Sell(82.5); ap.Print(); Console.Read(); ,1.访问基类成员,7.5.3 访问和隐藏基类成员,在派生类中,可以使
29、用base关键字访问基类成员。,【例7.11】在派生类中访问基类成员,class Fruit protected string name, place; protected int rank; public Fruit(string na, string pl, int ra) name = na; place = pl; rank = ra; public void Display() Console.Write(0的产地是1,等级是2, name, place, rank); ,【例7.11】在派生类中访问基类成员,class Apple : Fruit private double am
30、ount, price; public Apple(string na, string pl, int ra, double am, double pr) : base(na, pl, ra) amount = am; price = pr; public void Sell(double s) if (amount = s) amount -= s; else amount = 0; public new void Display() base.Display(); Console.WriteLine(,单价是0元,数量是1公斤,price, amount); ,【例7.11】在派生类中访问
31、基类成员,class Program static void Main(string args) Apple ap=new Apple(苹果,河北省,2,100,4.5); ap.Display(); ap.Sell(32.5); ap.Display(); ap.Sell(82.5); ap.Display(); Console.Read(); ,2.成员隐藏,在派生类中,通过定义与基类同名的新成员可以隐藏基类的成员,从而达到修改基类成员的目的。 为了达到隐藏基类成员的目的,必须在派生类成员的声明中加上new修饰符,否则编译器在编译时会发出警告信息。,7.6 多态,C#支持两种多态性:,编译
32、时多态性(静态多态性)在程序编译时就决定如何实现某一动作,它是通过重载实现的。 运行时多态性(动态多态性)是在程序运行时动态实现某一动作,它是通过继承和虚方法实现的。,虚方法:使用virtual 修饰符定义的方法。 派生类中重载虚方法:加上override修饰符。,【例7.12】实现多态,class Shape public virtual void Draw() /虚方法 public void Speak() /非虚方法 Console.WriteLine(This is a Shape); ,【例7.12】实现多态,class Rectangle : Shape public overr
33、ide void Draw() /重载虚方法 Console.WriteLine(* * * * * * * *); Console.WriteLine(* *); Console.WriteLine(* *); Console.WriteLine(* *); Console.WriteLine(* * * * * * * *); public new void Speak() /重写非虚方法 Console.WriteLine(This is a Rectangle); ,【例7.12】实现多态,class Triangle : Shape public override void Draw
34、() /重载虚方法 Console.WriteLine(*); Console.WriteLine(* *); Console.WriteLine(* *); Console.WriteLine(* *); Console.WriteLine(* * * * *); public new void Speak() /重写非虚方法 Console.WriteLine(This is a Triangle); ,【例7.12】实现多态,class Program static void Main(string args) Shape thing = new Shape(); Rectangle r
35、ec = new Rectangle(); Triangle tri = new Triangle(); thing = rec; thing.Speak(); thing.Draw(); Console.WriteLine(); thing = tri; thing.Speak(); thing.Draw(); Console.Read(); ,7.7一个面向对象程序设计的例子,万年历由年份、月份和日期所构成,也就是万年历这个问题包含年、月和日对象。,由于不需要对日期进行操作,因此不必实现日这个对象。 年对象主要维护年份这个数据,同时还需要计算从1980年到该年份包含多少天,以便计算月份的第
36、一天是星期几。 月对象主要维护月份这个数据,同时还需要计算该月份第一天是星期几,该月份的英文名缩写,以及计算指定月份的天数。 万年历对象负责显示指定月份的月历,它要维护年对象和月对象这两个数据。,class Year private int year; /当前年份 public Year(int y) year = y; public int CurrentYear /表示当前年份的属性 get return year; public int GetTotalDay() /1980年的总天数 int total = 0; for (int i = 1980; i year; i+) if (i %4 = 0 ,class Month private int month; /当前月份 private int year; /当前月份所在的年份 public Month(int m, int y) month = m; year = y; public int CurrentMonth /表示当前月份的属性 get return month; public string GetMonthName()/获取月份英文缩写 string Months = January, Februar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年芯片封装材料RoHS与REACH环保合规要求
- 2026年低空旅游地面保障条件:停机坪 机库 安检设施配置标准
- 2026年融资租赁服务减轻养老机构家庭用户机器人采购负担
- 2025年临床执业医师《妇产科》练习题
- 电商公司运营主管面试技巧
- 汽车行业研发部门高级工程师的面试指南
- 中国平安保险面试经验
- 餐饮行业食品安全管理与监督研究
- 房地产企业行政岗位面试全攻略
- 工业控制系统信息安全管理与防护策略研究报告
- GB/Z 132-2025航空航天电气要求套管和模缩套飞机用标准清单
- 2026年毛笔书法六级题库及答案
- 全屋定制培训课件
- 焊接作业现场应急处置方案
- 团播合作协议合同
- 派出所改造工程施工技术组织设计
- DB34∕T 5225-2025 风景名胜区拟建项目对景观及生态影响评价技术规范
- 2026年苏州工业职业技术学院单招职业技能测试必刷测试卷附答案
- 萨克斯独奏回家教案
- Unit5OldtoysPartBLet'stalkLet'slearn(课件)-人教PEP版英语三年级下册
- 津17SZ-9 天津市市政基础设施工程施工图设计审查要点 热力篇
评论
0/150
提交评论