C#程序设计主讲教师:杨剑1项目6:面向对象程序设计进阶——升级银行账户管理系统一、教学内容及要求能力培养:1、掌握静态类与静态类成员的定义与使用。2、理解类的继承性与多态性,掌握其应用方法。3、理解抽象类的概念,掌握抽象类的定义及使用方法。核心技能点:1、静态成员与静态类2、类的继承性与多态性3、抽象类的定义与使用扩展技能点:1、静态成员的作用,静态方法和实例方法的区别2、多态的概念和实现,虚方法和抽象方法的区别教学内容:1、项目介绍。任务1:升级银行账户管理系统(5分钟)2、案例演示:静态成员与静态类任务2:掌握静态类成员的定义与使用。(20分钟)实践:利用静态成员统计图书数量。任务3:掌握静态构造函数的定义与使用。(10分钟)实践:利用静态构造函数初始化图书数量。3、案例演示:类的继承性与多态性任务4:掌握类的继承性及其实现。(35分钟)实践:定义图形类及其派生子类圆形类、矩形类和三角形类。任务5:理解类的多态性及其实现方式。(45分钟)实践:输入相应图形的参数,如矩形的长和宽,单击相应的按钮,根据输入参数创建图形类并输出该对象的面积4、案例演示:抽象类任务6:熟练掌握抽象类与抽象方法的声明和使用。(10分钟)实践:把图形类转换为抽象类5、案例演示:使用XML代码注释功能任务7:掌握使用XML代码注释的方法(10分钟)实践:演示:使用XML进行代码注释6、项目实现:C#程序设计主讲教师:杨剑2任务8:升级银行账户管理系统的实现(30分钟)7、课内实践:任务9:熟练掌握静态类与静态类成员的定义与使用。理解类的继承性与多态性,掌握其应用方法。(60分钟)实践:设计一个Windows应用程序,在该程序中首先构造一个学生基本类,再分别构造小学生、中学生、大学生等派生类,当输入相关数据,点击不同的按钮(小学生、中学生、大学生)将分别创建不同的学生对象,并输入当前的学生总人数,该学生的姓名学生类型和平均成绩。要求如下:(1)每个学生都有的字段为:姓名、年龄(2)小学生的字段还有语文、数学,用来表示这两科的成绩(3)中学生在此基础上多了英语成绩。(4)大学生只有必修课和选修课两项成绩。(5)学生类具有方法来统计自己的总成绩并输出。(6)通过静态成员自动记录学生总人数。(7)成员初始化能过构造函数完成。二、教学重点、难点及解决办法教学重点:1.静态成员与静态类2.类的继承性与多态性3.抽象类的定义与使用教学难点:1.静态成员的作用,静态方法和实例方法的区别2.多态的概念和实现,虚方法和抽象方法的区别教学方法:基于CDIO的课程改革,应用了CDIO教育模式。以“做中学”为出发点,实施“知识讲解案例化、课内课外协作化、实战演练一体化”的教学模式。由传统的教师引导课堂转变为以学生为主体,课本中的知识点讲解转变为“项目”主导,将传统的课堂模式转变为了以实际经验为核心。三、教学设计1、教学进程工程化将教学内容按CDIO理念,以项目为核心,并结合课程内容设计了四个环节的内容,包括构思环节、设计环节、实现环节、运作环节,同时,在课程的教学过程中,主要采用“做中学”的教学理念来实现“教学做”一体化。以项目为载体,将抽象的知识融入到项目中,通过项目的学习将知识点分解,将“工程”教C#程序设计主讲教师:杨剑3学思想体现在教学中,进而提高学生的学习效果。2、教学设计递进化根据“工程化”的思想,教学模式的设计呈递进化趋势,每一个教学项目的实现将分成四个部分来完成:任务的明确,实施方案的编写,项目的实施和项目的评价3、实践设计层次化在项目的实施过程中,主要组织层次化教学。在教学中,采取“基础实验”“综合实验”,“综合性课程设计”的设计。4、课程考核工程化考核以过程考核和工程验收测试相结合的方式进行。本门课程采取的是形成性考核方式,考试成绩由本门课程学习期间的多项过程成绩组合而成5、知识讲解案例化根据CDIO的思想,对知识点采取案例化教学法,6、课内课外协作化7、实战演练一体化为了让学生对所学课程加深理论知识,并能够将相关知识结合到实际应用中,学生需要自选一个相关主题进行综合项目的开发,提高综合应用能力。在这个环节中,学生是主体,教师主要负责引导和监控,学生需要在这个阶段发挥自身能力,以团队的形式完成项目,并由此锻炼学生的团队合作意识。四、教学过程1、项目介绍。任务1:升级银行账户管理系统(5分钟)完善银行账户管理系统,增加一个VIP账户的管理。程序功能如下:(1)当点击“创建VIP账户”按钮时,显示如图所示信息,其中卡号为随机生成的一个在500000到999999之间的一个值,余额初始化为10000元;(2)在“取款”文本框中输入取款金额后,点击“取款”按钮,显示如图所示信息。C#程序设计主讲教师:杨剑4如果余额不足,VIP用户可以透支1000元,如取款800,而余额是400,则显示如图所示信息。如透支超过1000元,如取款1600,而余额是400,则显示如图所示信息;(3)要求:通过继承和多态实现上述操作;2、案例演示:静态成员与静态类任务2:掌握静态类成员的定义与使用。(20分钟)(1)静态成员——静态成员通过static关键字来标识,可以是静态方法、字段、属性或事件①静态成员属于类,通过类名引用②在类的实例创建以前完成初始化③被同一个类的所有实例共享C#程序设计主讲教师:杨剑5④例:classTime{publicstaticstringarea=“Chinese;}...Console.WriteLine(“地区:{0},Time.area);(2)静态方法和实例方法①使用static修饰的方法称为静态方法②使用实例对象调用的方法叫做实例方法(3)实践:利用静态成员统计图书数量。核心代码publicpartialclassTest5_1:Form{//创建Books型的数组对象,用来记录5本图书的信息Books[]bs=newBooks[5];privatevoidbtnAdd_Click(objectsender,EventArgse){//cbbType.SelectedIndex表示组合框中选择的项的索引,第一项的索引为0Typetype=cbbType.SelectedIndex==0?Type.Compute:Type.Novel;doubleprice=Convert.ToDouble(txtPrice.Text);//用Books.count获到当前的图书数目,以此做为索引号,并创建一个新的Books对象bs[Books.count]=newBooks(txtTitle.Text,type,price);Books.count++;//图书数量增加一个lblShow.Text=string.Format(添加成功:{0}本书,Books.count);}privatevoidbtnCount_Click(objectsender,EventArgse)C#程序设计主讲教师:杨剑6{lblShow.Text=string.Format(\n计算机类图书总数:{0},Books.NumberComputes());lblShow.Text+=string.Format(\n小说类图书总数:{0},Books.NumberNovels);lblShow.Text+=string.Format(\n图书名单如下:\n);foreach(Booksbinbs){if(b!=null)lblShow.Text+=string.Format({0},b.title);}}}publicenumType{Compute,Novel};publicclassBooks{//私有静态字段,分别统计计算机类和小说类的书目数量privatestaticintcompute;privatestaticintnovel;publicstaticintcount;//公共静态字段,统计总图书数量//公共字段,描述书目信息publicstringtitle;publicTypetype;publicdoubleprice;//构造函数,用来初始化对象publicBooks(stringtitle,Typetype,doubleprice){this.title=title;this.type=type;this.price=price;if(type==Type.Compute)compute++;if(type==Type.Novel)novel++;}//静态方法,返回计算机类图书数量publicstaticintNumberComputes(){C#程序设计主讲教师:杨剑7returncompute;}//静态方法属性,返回小说类图书数量publicstaticintNumberNovels{get{returnnovel;}}}}该程序中,类Books包含compute和novel两个私有静态字段成员、以及NumberComputes公共静态方法成员和NumberNovels公共静态属性,它们用来记录或返回计算机类和小说类的图书数量。另外还有一个count公共静态字段用来统计图书总数。当在二个文本框中依次输入并同时在组合框选择:(VisualC#.NET程序设计教程,计算机,32)、(数据结构,计算机,28)、(三国演义,小说,36)、(红楼梦,小说,49)、(C程序设计,计算机,29),,每输一组数据后需要点击“添加”按钮,后的程序运行效果如图所示。点击“统计”按钮,程序的运行效果如图5-2所示。C#程序设计主讲教师:杨剑8任务3:掌握静态构造函数的定义与使用。(10分钟)(1)静态构造函数①静态构造函数不是为了创建对象,而是用来初始化类②不能直接调用静态构造函数。静态构造函数在类的第一个实例创建之前或者调用类的任何静态方法之前执行,而且最多执行一次③语法:static静态构造函数名(){//语句;}④静态构造函数名与类名相同⑤静态构造函数时不能带访问修饰符⑥静态构造函数不能有任何参数列表和返回值(2)实践:利用静态构造函数初始化图书数量。我们可以在上例的基础上增加一个静态构造函数。//静态构造函数,用来初始化静态成员staticBooks(){compute=3;novel=2;}这样,在计算机类和文学类的图书数量初始时就为3本和2本,再按上例中的数据输入后,计算机类图书增加3本,共6本,而文学类图书增加2本,共4本。程序运行效果如图所示。3、案例演示:类的继承性与多态性任务4:掌握类的继承性及其实现。(35分钟)(1)继承性C#程序设计主讲教师:杨剑9①继承描述了“是什么种类”(isakindof)的关系②派生类从基类继承属性和方法,实现了代码重用③派生类变得更专门化(2)派生类的声明①派生类可以拥有自己的成员,也可以隐式地从它的基类继承所有成员,包括方法、字段、属性和事件(除有成员、构造函数)②语法:[访问修饰符]class类名[:基类名]{类的成员;}(3)基类成员的访问修饰符①private修饰符,只能由所属类的成员才能访问,无法在派生中被访问。②使用public修饰符可以在派生中被访问,也能在类外被访问。③protected声明的成员,只能由所属类或派生自所属类的类的成员访问,(4)示例:创建派生类publicclassAnimal{protectedboolIsSleeping;publicvoidSleep(){}publicvoidEat(){}}publicclassDog:Animal{publicvoidPlay(){}}...DogmyDog=newDog();Dog.Play();Dog.Eat();(5)可访问性和作用域——使用访问修饰符,可以定义应用程序中类成员的作用域C#程序设计主讲教师:杨剑10(6)构造函数的调用①调用父类带参的构造函数语法:public派生类构造函数名(形参列表):base(向基类构造函数传递的形参列表){}base()方法始终指向调用类的父类②在派生类中调用基类构造函数1系统首先执行