实验三类的重载继承和多态.docx
《实验三类的重载继承和多态.docx》由会员分享,可在线阅读,更多相关《实验三类的重载继承和多态.docx(11页珍藏版)》请在冰豆网上搜索。
实验三类的重载继承和多态
实验报告
课程名称
面向对象程序设计
实验名称
实验三、类的重载继承和多态
日期
2015.10.23
学生学号
姓名
班级
实验目的:
1.编写一个单一继承的C#程序
2.编写一个抽象类,并用一个类继承这个抽象类
实验要求:
1.认真阅读、掌握和本实验相关的教材内容。
2.设计并编写代码完成题目要求的任务。
3.撰写实验报告。
实验内容与步骤:
1.在学校教务管理系统中,有三种用户,一种是系统管理员,一种是学生,一种是教师,编写C#类实现该继承关系。
系统管理员/学生/教师都有用户名和密码属性,并都有Login和显示自身信息的方法,另外,学生拥有班级和成绩两个特殊属性以及查询成绩这一方法,教师拥有部门和工资两个特殊属性以及查询工资这一方法,系统管理员可以添加学生和教师信息。
由于教师和学生个人信息不同,所以学生和教师重载基类的DisplayInfo方法。
(本例和教材一致,再次出现的目的是通过反复训练,理解继承的作用)
1)类的继承关系可以表示如下:
2)创建控制台应用程序,命名为SchoolManagement
3)创建名为User的基类,基类定义了用户名和密码属性,以及Login和DisplayInfo方法
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceSchoolManagement
{
publicclassUser
{
privatestringuserName;//用户名
publicstringName
{
get{returnuserName;}
set{userName=value;}
}
privatestringpassword;//密码
publicstringPassword
{
get{returnpassword;}
set{password=value;}
}
privatestringuserType;//用户类型
publicstringUserType
{
get{returnuserType;}
set{userType=value;}
}
publicvoidLogin()
{
if(userName.Equals("1")&&password.Equals("1"))
{
DisplayPersonInfo();
}
}
publicvirtualvoidDisplayPersonInfo()//注意virtual关键字
{
Console.WriteLine("姓名:
{0}",userName);
Console.WriteLine("用户类型:
{0}",userType);
}
}
}
2)创建名为Student的派生类,具备班级和成绩两个特殊属性,以及查询成绩的特殊方法,覆盖基类的显示个人信息方法
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceSchoolManagement
{
publicclassStudent:
User
{
privatestringclassID;
publicstringClassID
{
get{returnclassID;}
set{classID=value;}
}
privatefloatstuScore;
publicfloatStuScore
{
get{returnstuScore;}
set{stuScore=value;}
}
publicStudent()
{
UserType="学生";
}
publicoverridevoidDisplayPersonInfo()
{
base.DisplayPersonInfo();
Console.WriteLine("班级:
{0}",classID);
}
publicvoidCheckScore()
{
Console.WriteLine("成绩:
{0}",this.stuScore);
}
}
}
3)创建名为Teacher的派生类,具备部门和工资两个特殊属性,以及查询工资的特殊方法,覆盖基类的显示个人信息方法。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceSchoolManagement
{
publicclassTeacher:
User
{
privatestringdepartment;//部门
publicstringDepartment
{
get{returndepartment;}
set{department=value;}
}
privatefloatsalary;//工资
publicfloatSalary
{
get{returnsalary;}
set{salary=value;}
}
publicTeacher()
{
UserType="教师";
}
publicoverridevoidDisplayPersonInfo()
{
base.DisplayPersonInfo();
Console.WriteLine("部门:
"+this.department);
}
publicvoidcheckSalary()
{
Console.WriteLine("工资:
"+this.salary);
}
}
}
4)创建名为SysManager的派生类,具备插入学生信息和插入教师信息两个方法
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceSchoolManagement
{
publicclassSysManager:
User
{
publicSysManager()
{
UserType="管理员";
}
publicStudentInsertStudent()
{
Studentstu=newStudent();
stu.Name="张郭郭";
stu.UserType="教师";
stu.ClassID="310730";
stu.StuScore=70;
returnstu;
}
publicTeacherInsertTeacher()
{
Teacherteacher=newTeacher();
teacher.Name="李沙沙";
teacher.Department="计算机系";
teacher.Salary=5000;
returnteacher;
}
}
}
5)在Program.cs的Main方法中调用以上类,测试效果如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceSchoolManagement
{
classProgram
{
staticvoidMain(string[]args)
{
//系统管理员登录
SysManagersys=newSysManager();
sys.Name="1";
sys.Password="1";
sys.Login();
Console.WriteLine("------------------------------");
//系统管理员录入学生和教师信息
Teacherteacher=sys.InsertTeacher();
Studentstu=sys.InsertStudent();
//显示教师信息,查询工资
teacher.DisplayPersonInfo();
teacher.checkSalary();
Console.WriteLine("------------------------------");
//显示学生信息,查询成绩
stu.DisplayPersonInfo();
stu.CheckScore();
Console.WriteLine("------------------------------");
}
}
}
6)最终运行效果如下
2.建立名为Shape的基类,要求是抽象类,在该类中提供一个publicabstractdoubleArea()的抽象方法,建立名为Circle的派生类,包括半径属性,实现面积计算,再建立一个名为Rectangle的派生类,包括长和宽两个属性,实现面积的计算。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceGetArea
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("请?
输º?
入¨?
圆2的Ì?
半ã?
径?
:
");
doubler=double.Parse(Console.ReadLine());
shapes=newCircle(r);
Console.WriteLine("圆2的Ì?
面?
积y是º?
:
{0}\n",s.Area());
Console.WriteLine("请?
输º?
入¨?
矩?
形?
的Ì?
长¡è和¨ª宽¨ª:
");
Console.Write("长¡è:
");
doublea=double.Parse(Console.ReadLine());
Console.Write("宽¨ª:
");
doubleb=double.Parse(Console.ReadLine());
shapef=newRectangle(a,b);
Console.WriteLine("矩?
形?
的Ì?
面?
积y是º?
:
{0}",f.Area());
Console.ReadLine();
}
publicabstractclassshape
{
publicabstractdoubleArea();
}
publicclassCircle:
shape
{
privatedoubler;
publicdoubleR
{
get{returnr;}
set{r=value;}
}
publicCircle(doubler)
{
this.r=r;
}
publicoverridedoubleArea()
{
returnMath.PI*r*r;
}
}
publicclassRectangle:
shape
{
privatedoubleside;
publicdoubleSide
{
get{returnside;}
set{side=value;}
}
privatedoublehigh;
publicdoubleHigh
{
get{returnhigh;}
set{high=value;}
}
publicRectangle(doubleside,doublehigh)
{
this.side=side;
this.high=high;
}
publicoverridedoubleArea()
{
returnside*high;
}
}
}
}
最终运行效果如下
实验总结(结论或问题分析):
本次实验我对基类、抽象类、派生类有了近一步的了解,知道了怎么建立这些类,还有在抽象类中创建抽象方法。
所以本次实验我学会了许多。
实验成绩
任课教师签名
郭俊恩