实验三类的重载继承和多态.docx
《实验三类的重载继承和多态.docx》由会员分享,可在线阅读,更多相关《实验三类的重载继承和多态.docx(11页珍藏版)》请在冰豆网上搜索。
实验三类的重载继承和多态
实验报告
课程名称
面向对象程序设计
实验名称
实验三、类的重载继承和多态
日期
2015.4.14
学生学号
姓名
班级
实验目的:
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;
namespaceshape
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("请输入圆的半径:
");
doubler=double.Parse(Console.ReadLine());
shapes=newCircle(r);
Console.WriteLine("圆的面积是:
{0}",s.Area());
Console.WriteLine("请输入矩形的长和宽:
");
doublea=double.Parse(Console.ReadLine());
doubleb=double.Parse(Console.ReadLine());
shapef=newRectangle(a,b);
Console.WriteLine("矩形的面积是:
{0}",f.Area());
Console.ReadLine();
}
}
publicabstractclassshape
{publicabstractdoubleArea(); }
publicclassCircle:
shape
{
privatedoubler;
publicdoubleR
{get{returnr;}
set{r=value;}
}
publicCircle(doubler)
{this.r=r;}
publicoverridedoubleArea()
{return3.14*r*r;}
}
publicclassRectangle:
shape
{
privatedoublea;
publicdoubleA
{get{returna;}
set{a=value;}
}
privatedoubleb;
publicdoubleB
{get{returnb;}
set{b=value;}
}
publicRectangle(doublea,doubleb)
{this.a=a;
this.b=b;
}
publicoverridedoubleArea()
{returna*b;}
}
}
按ctrl+F5运行程序,结果如下:
实验总结(结论或问题分析):
通过实验详细的了解了有关定义抽象类和抽象类方法的注意事项,并且在抽象类中要使用关键字abstract。
抽象类方法没有实现代码,但该抽象类的派生类都必须重载该方法。
将派生类中的对应方法定义为重载方法,则使用override关键字修饰。
抽象类不能直接使用new关键字来直接创建对象,但可以将其与派生类的实例相关联。
实验成绩
任课教师签名