8 CS高级编程.doc_第1页
8 CS高级编程.doc_第2页
8 CS高级编程.doc_第3页
8 CS高级编程.doc_第4页
8 CS高级编程.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

8、C#高级编程目标 单一继承 抽象类和抽象方法 使用委托和事件实现模拟闹铃。 飞机和客机类的多态程序第一部分 指导练习1:单一继承问题 现实生活中,哺乳动物是动物界中一个分支;可以动物普遍具有的特征都可以在哺乳动物身上找到;但哺乳动物也有自己独特的习性。因此可以将动物看成是哺乳动物的父亲。编程实现上可以通过哺乳动物类继承一般动物类,从而获得一般动物的特征。指导教师讲解问题说明 用C#编写一个程序,使用Animal和Mammal两个类来说明一般动物和哺乳动物的继承关系。Animal具有名称、所属门类等属性,需要提供方法实现以接收和显示这些属性的值。 Mammal类具有代表哺乳动物习性的属性,这些属性表明哺乳动物与其他类型动物的区别。同样地,需要提供方法实现以接收和显示这些属性的值。分析 Animal类是一个基类,它包含_name、_type两个成员以及用于接收和显示信息的三个方法。名为Mammal的派生类包含_temperature、_isViviparous两个成员和用于接收和显示信息的两个方法。 为了检验创建的Animal和Mammal类,应实例化一个Mammal类对象,并调用基类和派生类的方法来存储和检索值。推荐步骤:(1)新建一个名为“SingleInher”的基于控制台应用程序的项目。(2)将以下代码添加到“Program.cs”中。using System;using System.Collections.Generic;using System.Text;namespace SingleInher /一般动物类 class Animal protected string _name; /动物名称 protected string _type; /动物所属门类 /接收名称和门类 public void AcceptDetails() Console.WriteLine(请输入动物名称:); this._name = Console.ReadLine(); Console.WriteLine(请输入所属门类:); this._type = Console.ReadLine(); /显示动物的名称和所属门类 public void DisplayDetails() Console.WriteLine(); Console.WriteLine(0 动物的详细信息如下:, this._name); Console.WriteLine(姓名:0, this._name); Console.WriteLine(门类:0, this._type); /哺乳动物类,继承一般动物类 class Mammal : Animal private double _temperature; /恒定温度值 private string _isViviparous; /是否为胎生 /接收哺乳动物的特征信息 public void AcceptCharacter() Console.WriteLine(请输入哺乳动物的恒定温度:); try _temperature = Convert.ToDouble(Console.ReadLine(); catch /捕捉异常,例如:若输入字母,在转换成Decimal时会引发异常 Console.WriteLine(请为温度输入数字!); Console.WriteLine(该哺乳动物是否胎生:); _isViviparous = Console.ReadLine(); /显示哺乳动物的特征信息 public void DisplayCharacter() Console.WriteLine(); Console.WriteLine(0 的特征包括:, this._name); Console.WriteLine(恒定温度:0, _temperature.ToString(); Console.WriteLine(是否胎生:0, _isViviparous); class Program static void Main(string args) Mammal objM = new Mammal(); objM.AcceptDetails();/访问父类方法 objM.AcceptCharacter(); objM.DisplayDetails();/访问父类方法 objM.DisplayCharacter(); (3)生成项目。(4)选择“调试” “开始执行(不调试)”选项来执行此应用程序,输出结果如图1.1所示。图1.1 练习1的输出结果练习2:使用抽象类和抽象方法计算不同形状的面积问题 编写一个程序,使用抽象类和抽象方法来计算不同形状的面积。指导教师讲解问题说明 先定义一个抽象类,该抽象类有一名为计算面积的方法为抽象方法。指导教师分析解题思路 定义好抽象类和抽象方法后,具体的类继承该抽象类,实现抽象方法。该问题中定义两个具体形状类:矩形和圆。解决方案:(1)创建一个基于控制台的项目“AbstractClass”。(2)建立一个抽象类,命名为“Figure”, 定义变量和抽象方法Area()。(3)定义两个具体类Square和Circle继承自Figure类,在各自类中分别实现Area()方法。(4)创建一个测试类,分别调用Square和Circle类。(5)添加以下完整的代码using System;abstract class Figure/抽象类定义,表示一个抽象图形 protected double x = 0, y = 0; public Figure(double a, double b) x = a; y = b; public abstract void Area(); /抽象方法,无实现代码,抽象图形无法计算面积class Square : Figure /类Square定义,矩形类 public Square(double a, double b) : base(a, b) public override void Area() /不能使用new,必须用override Console.WriteLine(矩形面积是:0, x * y); /显示矩形面积class Circle : Figure /类Circle定义,圆类 public Circle(double a) : base(a, a) public override void Area() Console.WriteLine(圆面积是:0, 3.14 * x * y); /显示圆的面积class Class1 static void Main(string args) Square s = new Square(20, 30); Circle c = new Circle(10); s.Area(); c.Area(); (6)选择“生成”“生成解决方案”选项,以生成此项目。(7)选择“调试” “开始执行(不调试)”选项来执行此应用程序。 此程序的输出结果如图2.1所示。图2.1 程序输出结果指导教师检查学生进度练习3:使用委托和事件实现模拟闹铃问题 编写一个模拟闹铃的程序,具有闹铃,继续闹铃,打会盹儿,停止闹铃的功能。指导教师讲解问题说明 编写一个程序用来模拟闹钟闹起床流程,有一个闹钟类AlarmClock,催促起床类WakeMeUp,使用类AlarmDriver。调用类引发开始闹铃事件,闹钟类调用委托方法进行处理,催促起床类和用户进行交互。指导教师分析解题思路 在此问题中,可以设计考试类来控制流程。闹钟类应该有一个可以引发开始闹铃的方法由使用类调用。这是一种常用的类设计方式,就是建立一些实体类,这些实体类由控制流程的类来进行关联。解决方案:(1)创建一个基于控制台的项目“EventSample”。(2)建立一个类,命名为“AlarmEventArgs”, 定义事件参数类。(3)声明自定义代理类型,它的事件参数的类型为AlarmEventArgs。(4)创建包含事件和触发事件方法的类:AlarmClock。(5)创建包含事件处理方法的类:WakeMeUp。(6)创建包含程序入口方法的类:AlarmDriver。(7)添加以下完整的代码using System;using System.Collections.Generic;using System.Text;namespace EventSample / / 定义事件参数类 / public class AlarmEventArgs : EventArgs private readonly bool snoozePressed; private readonly int nrings; /构造函数 public AlarmEventArgs(bool snoozePressed, int nrings) this.snoozePressed = snoozePressed; this.nrings = nrings; / 定义属性,私有字段nrings public int NumRings get return nrings; / 定义属性,返回私有字段snoozePressed public bool SnoozePressed get return snoozePressed; / 下面的属性返回一个字符串 public string AlarmText get if (snoozePressed) return (别打打盹儿,快起床!); else return (起床!); / 声明自定义代理类型,它的事件参数的类型为AlarmEventArgs public delegate void AlarmEventHandler(object sender, AlarmEventArgs e); / 包含事件和触发事件方法的类 public class AlarmClock private bool snoozePressed = false; private int nrings = 0; private bool stop = false; / 定义两个属性 public bool Stop get return stop; set stop = value; public bool SnoozePressed get return snoozePressed; set snoozePressed = value; / 声明事件,它所使用的代理类型为AlarmEventHandler public event AlarmEventHandler Alarm; / 触发事件的方法 protected virtual void OnAlarm(AlarmEventArgs e) if (Alarm != null) / 通过代理调用事件处理方法 Alarm(this, e); / 在该方法中循环调用OnAlarm方法来触发事件,直到 / stop字段的值为true public void Start() for (; ; ) nrings+; if (stop) break; else if (snoozePressed) / 程序暂停1秒钟 System.Threading.Thread.Sleep(1000); / 创建事件参数对象实例 AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); / 触发事件,在事件处理方法中会 / 相应地设置snoozePressed和stop/ 字段的值(通过属性来设置) else / 程序暂停0.3秒 System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); / 触发事件 / 包含事件处理方法的类 public class WakeMeUp / 事件处理方法 / 在该方法中根据用户的输入来通过事件参数sender / 设置事件发送者属性, public void AlarmRang(object sender, AlarmEventArgs e) Console.WriteLine(e.AlarmText + n); if (!(e.SnoozePressed) if (e.NumRings % 10 = 0) Console.WriteLine(继续闹铃?输入Y); Console.WriteLine(打会盹儿?输入N); Console.WriteLine(停止闹铃?输入Q); String input = Console.ReadLine(); if (input.Equals(Y) | input.Equals(y) return; else if (input.Equals(N) | input.Equals(N) / 通过事件参数sender来访问触发事件的对象 (AlarmClock)sender).SnoozePressed = true; return; else (AlarmClock)sender).Stop = true; return; else Console.WriteLine( 继续闹铃?输入Y); Console.WriteLine( 停止闹铃?输入Q); String input = Console.ReadLine(); if (input.Equals(Y) | input.Equals(y) return; else (AlarmClock)sender).Stop = true; return; / 包含程序入口方法的类 public class AlarmDriver / 入口方法 public static void Main(string args) / 创建事件接收者对象实例 WakeMeUp w = new WakeMeUp(); / 创建事件发送者对象实例 AlarmClock clock = new AlarmClock(); / 把事件处理方法绑定到发送者的事件上 clock.Alarm += new AlarmEventHandler(w.AlarmRang); clock.Start(); (8)选择“生成”“生成解决方案”选项,以生成此项目。(9)选择“调试” “开始执行(不调试)”选项来执行此应用程序。 此程序的输出结果如图3.1所示。图3.1 EventSample的输出结果指导教师检查学生进度第二部分练习练习:多态(polymorphism) C#可以通过使用关键字virtual在基类中定义虚方法,用override在派生类重载虚方法实现多态。以飞机类和客机类的代码来说明如何实现多态。指导教师分析解题思路 分别创建类Plane和Airliner的实例p和a,先调用类Plane的方法Report,然后把p指向a,再调用Report方法,此时实际上调用了类Airliner被重载的方法Report。 具体代码如下所示:using System;using System.Collections.Generic;using System.Text;namespace Polymorphism class Plane /定义飞机类 public int wheels; /飞机轮子数量protected int weight; /飞机重量,是受保护的变量 public Plane() ; public Plane(int w1, int w2) wheels = w1; weight = w2;

温馨提示

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

最新文档

评论

0/150

提交评论