《C#实验报告-类与对象(共12页).docx》由会员分享,可在线阅读,更多相关《C#实验报告-类与对象(共12页).docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验项目名称: 类与对象一、实验目的和要求1.C#程序编写的过程和基本要求; 2.面向对象的程序设计思维(基本思想) ; 3.类的组成、声明和定义; 4.对象的定义(类的实例化) ; 5.理解字段和属性,属性的定义以及相对应的访问修饰符; 6.方法以及方法的重载; 7.构造函数的使用; 8.类的继承(重点); 9.类的多态性(难点)二、实验内容和过程1. 上机实验1: 问题描述:编写一个学生类,其中包括3个数据成员:学号、姓名、年龄,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。要求:使用成员函数实现对数据的输出 (显示学生的相关信息) ;使
2、用构造函数实现对数据的输入 (可以重载多个构造函数并使用)。 提示:三个成员变量使用什么访问控制符?提高要求:将三个成员变量定义为属性,并且学号和姓名只能读不能写,年龄可写,但是要符合1826 之间。解决方法说明:在学生类中,定义学号、姓名、年龄相关的字段以及属性;编写带三个参数的构造函数,实现对学生学号、姓名、年龄数据的输入;重载构造函数,带两个参数,实现对学生学号、姓名的输入;编写成员函数print(),实现对数据的输出;编写主函数,使用这个类,实现对学生数据的赋值和输出;l 实例化学生类;l 使用对象.print()方法。关键代码及注释:class student protected s
3、tring stuNum; protected string stuName; protected int stuAge; public string StuNum /定义属性:学号 get return stuNum; public string StuName /定义属性:姓名 get return stuName; public int StuAge /定义属性:年龄 get return stuAge; set if (value = 18 | value = 26) /限制年龄 stuAge = value; public student(string number, string
4、name, int age) /构造函数1,实现对数据的输入 stuNum = number; stuName = name; stuAge = age; Console.WriteLine(请输入学号); stuNum = Console.ReadLine(); Console.WriteLine(请输入姓名); stuName = Console.ReadLine(); Console.WriteLine(请输入年龄); stuAge = Convert.ToInt32(Console.ReadLine(); public student(string number, string nam
5、e) /构造函数2,实现对数据的输入 stuNum = number; stuName = name; Console.WriteLine(请输入学号); stuNum = Console.ReadLine(); Console.WriteLine(请输入姓名); stuName = Console.ReadLine(); public void print() /print方法,输出学生信息 if (stuAge != 0) Console.WriteLine(stuName + 的学号是: + stuNum + ,年龄是: + stuAge); Console.ReadLine(); el
6、se Console.WriteLine(stuName + 的学号是: + stuNum); Console.ReadLine(); public static void Main() /主函数,使用学生类 student A = new student(209, A, 18); A.print(); student B = new student(11, B); B.print(); 出错调试说明:排除错误的数据类型数据的输入,没有出错。运行结果说明(附运行界面图)图1 实验1运行结果图2. 上机实验2 问题描述: 定义一个电话Telephone类,有两个公有字段 numbers (号码)
7、和attributi(归属区),还有一个拔号 dial()和响铃ring()方法; 创建一个 Telephone 类的子类 Mobilephone,它继承父类的两个字段和方法,新增一个私有字段brand(品牌)以及一个方法 playmp3(); 创建以下两个类并实例化,调用相应的方法(方法内容用 Messagebox显示提示即可,比如点击电话的“来电”按钮,显示“你的电话响了”之类的提示)。 解决方法说明: 创建基类Telephone类,在类里定义两个字段numbers (号码)和attributi(归属区); 声明虚成员拔号 dial()方法,声明响铃ring()方法,方法内都用引用 Mes
8、sageBox.Show()方法; 创建子类Mobilephone类继承于Telephone类,定义字段brand(品牌)以及一个方法 playmp3(),方法内引用 MessageBox.Show()方法; 子类Mobilephone类用override重写拔号 dial()方法,使用关键字base访问基类的 dial()方法; 界面设计; 实例化Telephone类和Mobilephone类; 编写事件代码,调用相应的方法以及在MessageBox.Show()方法里的“内容”这一参数里调用相应的字段; 调试; 把步骤里的override关键字改成new关键字; 调试并与步骤的结果比较。程
9、序界面设计:图2 实验2接界面设计图关键代码及注释: public partial class Form1 : Form Telephone telephone = new Telephone(); /实例化 Telephone类 Mobilephone mobilephone = new Mobilephone(); /实例化 Mobilephone类 public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) MessageBox.Show(telephone.nu
10、mbers,号码, MessageBoxButtons.OK); private void button2_Click(object sender, EventArgs e) MessageBox.Show(telephone.attribution, 所在地, MessageBoxButtons.OK); private void button3_Click(object sender, EventArgs e) telephone.dial(); private void button4_Click(object sender, EventArgs e) telephone.ring();
11、 private void button5_Click(object sender, EventArgs e) MessageBox.Show(mobilephone.numbers, 号码, MessageBoxButtons.OK); private void button6_Click(object sender, EventArgs e) MessageBox.Show(mobilephone.attribution, 所在地, MessageBoxButtons.OK); private void button7_Click(object sender, EventArgs e) m
12、obilephone.dial(); private void button8_Click(object sender, EventArgs e) mobilephone.ring(); private void button9_Click(object sender, EventArgs e) mobilephone.playmp3(); public class Telephone public string numbers = ; /字段numbers public string attribution = 梅州; /字段attribution public virtual void d
13、ial() /虚成员dial() 方法 MessageBox.Show(电话, 拨号方式, MessageBoxButtons.OK); public void ring() / ring()方法 MessageBox.Show(电话响了, 来电, MessageBoxButtons.OK); public class Mobilephone : Telephone private string brand; /字段brand public override void dial() /用override重写 dial()方法 base.dial(); /base关键字访问基类 dial()方法
14、 MessageBox.Show(手机, 拨号方式, MessageBoxButtons.OK); public void playmp3() MessageBox.Show(谁动了我的琴弦-周笔畅, 来电铃声, MessageBoxButtons.OK); 运行界面图(其一):实验2 运行界面图上机实验3:问题描述: 创建抽象类Shape,声明求面积的抽象方法 GetArea() ; 创建子类,矩形Rectangle,重写基类的GetArea()方法,实现求面积(长X宽) ; 创建子类,圆Circle,重写基类的GetArea()方法,实现求面积(PI X 半径2) ; 创建窗体应用程序,进
15、行相应的实例化,显示计算结果。 解决方法说明: 用abstract关键字 ,创建抽象类Shape以及声明求面积的抽象方法 GetArea(); 创建子类矩形Rectangle,定义属性长Lenth 和宽Weight,重写基类的GetArea()方法,方法内容是返回长与宽的乘积; 创建子类圆Circle,定义属性半径R,重写基类的GetArea()方法,方法内容是返回面积(PI X 半径2) ; 界面设计及属性设置; 编写相应的事件内容,在button1_Click(object sender, EventArgs e)事件中,根据单选按钮,分别实例化Rectangle类和Circle类,并判断
16、文本框所输入的是否是数字,调用相应的方法; 调试。 程序界面设计: 图3 实验3界面设计图关键代码及注释: public partial class Form1 : Form public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) textBox1.Text = 输入长:; textBox2.Text = 输入宽:; textBox3.Text = 输入半径:; private void textBox1_Enter(object sender, EventArgs e)
17、 textBox1.SelectAll(); private void textBox2_Enter(object sender, EventArgs e) textBox2.SelectAll(); private void textBox3_Enter(object sender, EventArgs e) textBox3.SelectAll(); private void button1_Click(object sender, EventArgs e) if (radioButton1.Checked = true) Rectangle rectangle = new Rectang
18、le(); float aa=1; if (Single.TryParse(textBox1.Text, out aa) = false | Single.TryParse(textBox2.Text, out aa) = false) MessageBox.Show(请重新输入, 提示, MessageBoxButtons.OK); else rectangle.Length = Convert.ToSingle(textBox1.Text); rectangle.Weight = Convert.ToSingle(textBox2.Text); MessageBox.Show(rectan
19、gle.GetArea().ToString(), 矩形面积, MessageBoxButtons.OK); textBox1.Text = 输入长:; textBox2.Text = 输入宽:; else Circle circle = new Circle(); float bb = 1; if (Single.TryParse(textBox3.Text, out bb) = false) MessageBox.Show(请重新输入, 提示, MessageBoxButtons.OK); circle.R = Convert.ToSingle(textBox3.Text); Messag
20、eBox.Show(circle.GetArea().ToString(),圆形面积,MessageBoxButtons.OK); textBox3.Text = 输入半径:; public abstract class Shape /抽象类 public abstract double GetArea();/抽象方法 public class Rectangle : Shape /子类矩形 private float lenth ,weight ; public float Length get return lenth; set lenth = value; public float We
21、ight get return weight; set weight = value; public override double GetArea() /重写 GetArea() 方法 return lenth * weight; public class Circle : Shape /子类圆 private float r; public float R get return r; set r = value; public override double GetArea() /重写 GetArea() 方法 return 3.14 * r * r; 运行界面图:图4 实验3运行界面图1
22、图4 实验3运行界面图2三、总结。1. 总结抽象类与抽象方法的关系。如何重写实现抽象类的抽象方法? 抽象方法一定位于抽象类里面,抽象类不一定包括抽象方法。 在子类中,用关键字override重写抽象类的抽象方法。2. 根据对类的多态性的学习,总结说明对实现类的多态的各种方式。 类的多态性的本质:同名方法的处理。 编译多态和运行多态的区别及特点:u 编译时的多态:通过重载来实现。对于非虚的成员来说,系统在编译时根据传递的参数、返回的类型等信息决定实现何种操作。特点是运行速度快。u 运行时的多态:通过虚成员来实现。直到系统运行时才根据实际情况决定实现何种操作。特点是高度灵活和抽象。 编译多态的实现:通过重载来实现。编译多态的规定:函数中,参数的个数、数据类型或参数的位置不同。 运行时多态实现的三种方式及其规定。u 虚方法:基类中,用关键字Virtual,派生类中用关键字New 或Override重写基类虚方法。u 抽象方法:基类中,用关键字abstract定义抽象方法,派生类中用关键字Override重写该抽象方法。u 接口:在实现时,在方法名前加接口名.(如 void Ipicture.show());在运行时,应用接口名称(接口名 对象名 = 派生类对象)专心-专注-专业