第4章 面向对象基础教学设计.docx

上传人:b****8 文档编号:10219725 上传时间:2023-02-09 格式:DOCX 页数:19 大小:113.31KB
下载 相关 举报
第4章 面向对象基础教学设计.docx_第1页
第1页 / 共19页
第4章 面向对象基础教学设计.docx_第2页
第2页 / 共19页
第4章 面向对象基础教学设计.docx_第3页
第3页 / 共19页
第4章 面向对象基础教学设计.docx_第4页
第4页 / 共19页
第4章 面向对象基础教学设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

第4章 面向对象基础教学设计.docx

《第4章 面向对象基础教学设计.docx》由会员分享,可在线阅读,更多相关《第4章 面向对象基础教学设计.docx(19页珍藏版)》请在冰豆网上搜索。

第4章 面向对象基础教学设计.docx

第4章面向对象基础教学设计

传智播客

《C#程序设计基础入门教程》

教学设计

 

课程名称:

C#程序设计基础入门教程

授课年级:

2014年级

授课学期:

2014学年第一学期

教师姓名:

某某老师

 

2014年02月09日

课题名称

第4章面向对象基础

计划学时

6课时

内容分析

C#是一种面向对象的语言,认识面向对象的编程思想对于C#学习至关重要。

在面向对象中,有两个重要的概念,分别是类和对象,本课程将对类和对象的基本知识进行详细讲解,并结合程序学习如何使用面向对象的思想开发C#应用

教学目标及基本要求

要求学生理解面向对象的程序设计思想,掌握类的设计、对象的创建、类的封装、构造方法的定义及其重载、this和static关键字的使用以及单例设计模式,了解垃圾回收机制、嵌套类和匿名类的使用。

重点及措施

教学重点:

类的定义、对象的创建、类的封装、构造方法的定义和重载、this和static关键字的使用、单例设计模式

难点及措施

教学难点:

类与对象的创建和使用、构造方法重载的规则、this关键字和static关键字的使用、单例设计模式

教学方式

教学采用教师课堂讲授为主,使用教学PPT讲解

第一课时

(面向对象概念、类与对象、类的定义、对象的创建与使用)

面向对象的概念

✧什么是面向对象

面向对象是一种符合人类思维习惯的编程思想。

现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。

在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。

✧面向对象的好处

同面向过程进行比较,面向对象的好处是:

●代码的复用性提高

●使用者无须关心具体的实现细节

●转变程序员的角色,更加符合人的思维习惯

✧面向对象的特征

●封装性:

●继承性:

●多态性:

类与对象的关系

✧用具体的例子引导。

例如:

玩具和玩具模型的关系。

在上面的图中,玩具模型可看作是一个类,一个个玩具可看作对象。

玩具是由玩具模型创建出来的,同理,对象是根据类创建出来的,并且一个类可以创建多个对象。

✧总结

类用于描述多个对象的共同特征,它是对象的模板。

对象用于描述现实中的个体,它是类的实例。

类的定义

✧为什么定义类

由于对象是虚拟出来的东西,是看不见摸不着的,我们需要在程序中使用对象,就必须找到描述对象的方式,定义一个类就可以解决这个问题。

✧类的定义

将一系列特征相似的对象中的共同属性和方法抽象出来用一段特殊的代码来进行描述,这段特殊的代码我们就称之为一个类。

类使用class关键字来进行定义,后面跟上类的名称。

✧定义一个Person类

classPerson

{

publicintage;

publicvoidSpeak()

{

Console.WriteLine("大家好,我今年"+age+"岁!

");

}

}

其中,Person是类名,age是成员变量,Speak()是成员方法。

在成员方法Speak()中可以直接访问成员变量age。

对象的创建与使用

✧对象的产生

应用程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象。

在C#程序中可以使用new关键字来创建对象,具体格式如下:

类名对象名称=new类名();

例如,创建Person类的实例对象代码如下:

Personp=newPerson();

其中“newPerson()”用于创建Person类的一个实例对象,“Personp”则是声明了一个Person类型的变量p。

中间的等号用于将Person对象在内存中的地址赋值给变量p,这样变量p便持有了对象的引用。

在内存中变量p和对象之间的引用关系如下图所示。

✧对象的使用

在创建Person对象后,可以通过对象的引用来访问对象所有的成员,具体格式如下:

对象引用.对象成员

通过一段代码来演示对象的使用情况。

Personp1=newPerson();

Personp2=newPerson();

p1.age=18;

p1.Speak();

p2.Speak();

执行完毕后,对象在内存中的状态如图所示。

✧成员变量的初始化

当一个对象被创建时,C#运行环境会对其中各种类型的成员变量自动进行初始化赋值。

基本数据类型初始化值为0,引用数据类型初始化值为null。

✧对象的生命周期

每个创建的对象都有自己的生命周期,对象只能在其有效的生命周期被使用。

当没有任何变量引用这个对象时,它将成为垃圾对象,不能再被使用。

对象变成垃圾的第一种情况:

对象变成垃圾的第二种情况:

第二课时

(类的设计、属性、访问修饰符、构造方法的定义和重载)

类的设计

在C#中,对象是通过类创建出来的。

因此,在程序设计时,最重要的就是类的设计。

例如,要在程序中描述一个学校所有学生的信息,可以先设计一个学生类(Student),在这个类中定义两个字段name、age分别表示学生的姓名和年龄,定义一个方法Introduce()表示学生做自我介绍,具体代码如下:

publicclassStudent

{

publicstringname;

publicintage;

publicvoidIntroduce(){

//在控制台输出属性name和age的值

Console.WriteLine("大家好,我叫"+name+",我今年"+age

+"岁!

");

}

}

属性

✧为什么要属性

根据上述定义好的Student类创建对象,通过创建好的对象就可以为程序中的name和age赋值,当把age赋值为一个负数-30时,虽然程序不会报错,但在现实生活中明显是不合理的。

为了解决年龄不能为负数的问题,在设计一个类时,应该对字段的访问作出一些限定,不允许外界随意访问,此时就可以使用属性。

✧属性

在程序中,使用属性封装字段时,需要将字段访问级别设为private,并通过属性的get和set访问器来对字段进行读写操作,从而保证类内部数据安全。

属性分为三种,具体如下:

●读写属性

●只读属性

●只写属性

访问修饰符

在C#中,访问修饰符共有四种,分别是public、protected、internal、private,这些访问修饰符可以修饰类和方法,还可以修饰字段、属性、索引器,不同访问修饰符控制不同的访问级别。

构造方法的定义

✧为什么需要构造方法

实例化一个类的对象后,如果要为这个对象中的字段赋值,则必须要访问对象的属性。

如果需要在实例化对象的同时就为这个对象的字段进行赋值,可以通过构造方法来实现。

✧构造方法的定义

●构造方法的名称与类相同

●没有返回值类型声明

●不能在方法中使用return语句返回一个值

注意:

没有返回值类型声明不等同于“void”,void也是一种返回值类型声明,请注意构造方法与返回类型为void的方法的区别。

✧构造方法的重载

与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。

✧构造方法的一些细节

●每一个类都至少有一个构造方法,如果在定义类时,没有显式地

声明任何构造方法,系统会自动为这个类创建一个无参的构造方法,里面没有任何代码。

●在定义构造方法时,如果没有特殊需要,都应该使用public关键

字修饰。

 

第三课时

(this关键字、索引器、垃圾回收、static关键字)

this关键字

✧this关键字的作用

可以解决成员变量与局部变量名称冲突的问题。

✧this关键字的三种用法

●通过this关键字可以明确地去访问一个类的成员变量

●通过this关键字调用成员方法。

●构造方法是在实例化对象时被C#运行环境自动调用的,在程序中

不能像调用其它方法一样去调用构造方法,但可以在一个构造方法中使用“this([参数1,参数2…])”的形式来调用其它的构造方法。

✧使用this时需要注意的问题

●不能在成员方法中使用this来调用其他方法。

索引器

✧为什么要索引器

通常情况下,属性只能访问单一的字段,如果想访问多个数据成员,就需要使用索引器,索引器是类的特殊成员,它可以根据索引在多个数据成员中进行选择。

索引器的语法与属性非常相似,能够让对象以类似数组的方式来存取。

这样使程序看起来更为直观,更容易编写。

✧索引器的定义

索引器的定义方式与属性定义方式类似,其基本的语法格式如下所示:

[修饰符]数据类型this[索引类型index]

{

get{//返回参数值}

set{//设置隐式参数value给字段赋值}

}

在上述语法格式中,使用this关键字加[索引类型index]的形式来创建一个索引器,在索引器中同样会使用get和set访问器,来获取属性值和设置属性值。

垃圾回收机制

一个对象在没有任何变量引用时,这个对象便成为内存垃圾。

而C#运行环境有自动的垃圾回收机制,垃圾回收器会不定期对内存垃圾进行查找并清除,保证最大的内存利用率。

static关键字

static关键字可以修饰类的成员,如成员变量、成员方法以及代码块等。

被static修饰的成员都是静态成员,如被static修饰的字段被称为静态字段。

被static修饰的成员,都使用“类名.静态成员名”的方式访问。

静态字段

✧特点

静态字段中存储的数据在内存中只有一份,并且可以被类的所有实例对象所共享。

例如某个学校所有学生共享一个学校名称,此时完全不必在每个学生对象所占用的内存空间都定义一个字段来存储这个学校名称,可定义一个静态字段来表示学校名称让所有对象来共享。

✧注意的问题

静态字段是被static关键字修饰的字段,它不属于任何对象,只属于类,而且只能通过“类名.静态字段名”的方式来访问。

静态属性

✧特点

静态属性可以读写静态字段的值,并保证静态字段值的合法性。

静态方法

✧特点

静态方法可以在不创建对象的情况下就可以调用某个方法,也就是使该方法不必和对象绑在一起。

同其他静态成员类似,静态方法使用“类名.方法名”的方式来访问。

✧注意的问题

由于静态方法在类加载时就会被初始化,而实例对象的初始化晚于静态方法,因此在静态方法中不能引用在其方法体外创建的实例对象。

静态类

✧特点

当类中的成员全部是静态成员时,就可以把这个类声明为静态类。

静态构造方法

✧特点

静态构造方法的作用是初始化静态成员。

一个类只能有一个静态构造方法,该静态构造方法没有任何修饰符,也没有参数,可以被定义在静态类或非静态类中。

用户无法像使用普通构造方法那样直接使用静态构造方法,静态构造方法会在程序创建第一个实例或引用任何静态成员之前,完成类中静态成员的初始化。

第四课时

(单例模式、嵌套类、匿名类、对象初始化器)

单例模式

✧什么是设计模式

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。

设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。

✧单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

✧单例设计模式的特征

●将构造方法私有化。

●对外提供一个公有的get方法,让别人通过此方法来获得实例。

●由于不能创建对象,所以get方法必须静态,这样别人才能使用“类

名.方法名”的方式访问。

●需要保证单例,所以要提供一个静态变量记住一个实例用于返回。

●该实例应该私有,禁止外界通过直接访问进行改动。

✧单例模式的示例代码

下面是一个实现了单例设计模式的程序。

classSingle

{

//创建一个静态Single类的对象并为其赋值

privatestaticSingleinstance=newSingle();

privateSingle(){}

publicstaticSingleGetInstance()

{

if(instance==null)

{

instance=newSingle();

}

returninstance;

}

}

嵌套类

✧定义

在C#中,可以将类定义在另一个类的内部,被包含的类称作嵌套类,而包含嵌套类的类就称作外部类。

实际上,嵌套类与普通类相似,只是被声明的位置比较特殊,致使其访问权限与引用方式与普通类有所区别。

✧注意的问题

外部类与嵌套类的非静态成员可以重名,在对非静态成员访问时,需要先创建它所在类的对象。

在嵌套类内不能声明静态成员,但嵌套类可以直接引用外部类的静态成员。

想要在作用域范围之外引用嵌套类,需要使用类似“Outer.Nesting”的完整限定名方式。

匿名类

✧定义

有时候某个类的实例只会用到一次,这时可以使用匿名类的方式创建实例,即无需显式定义一个类,就可以将一组只读属性封装到单个对象中。

对象初始化器

✧为什么使用对象初始化器

在一个类中,通常是使用构造方法来为属性赋值,当一个类中属性过多时,不可能为每种情况都创建一个构造方法,此时可以使用对象初始化器来为属性赋值。

✧对象初始化器的语法格式

类名变量名=new类名(){属性名=值,属性名=值……};

第五课时

上机练习(总结,测试题)

1、总结本章内容

2、通过题库发放相关测试题,检查学生掌握情况。

上机练习主要针对本章中需要重点掌握的知识点,以及在程序中容易出错的内容进行练习,通过上机练习可以考察同学对知识点的掌握情况,对代码的熟练程度。

上机一:

(考察知识点为属性)

请按照以下要求设计一个Student类。

要求如下:

1)定义一个Student类,该类中定义两个字段name和age,然后通过set构造器对传入的参数进行检查,保证字段值的合法性,用get构造器来获取Student类中字段的值。

2)定义一个测试类,在Main()方法中创建Student对象,然后通过该对象的属性为name和age赋值,最后调用Speak()方法输出学生信息。

示例代码如下:

classStudent

{

privatestringname;

publicstringName

{

set

{

name=value;

}

get

{

returnname;//返回name值

}

}

privateintage;

publicintAge

{

set

{

if(value<0)

{

age=0;

}

else

{

age=value;

}

}

get

{

returnage;//返回age值

}

}

publicvoidSpeak()

{

Console.WriteLine("我的名字是"+name+",今年"+age

+"岁");

}

}

publicclassTest

{

publicstaticvoidMain(string[]args)

{

Students1=newStudent();

s1.Name="小新";

s1.Age=-30;

s1.Speak();

Console.ReadKey();

}

}

上机二:

(考察知识点为构造方法重载)

请按照以下要求设计一个Student类。

要求如下:

1)在Student类中定义三个重载的构造方法,一是无参的构造方法,二是接收一个string类型参数的构造方法,该方法用于为Name属性赋值,三是接收两个参数的构造方法,该方法用于为Name、Age字段赋值。

2)定义一个测试类,在Mian()方法中创建三个Student对象,并在创建对象时为name、age字段赋值。

示例代码如下:

classStudent

{

publicstringName

{

get;set;

}

publicintAge

{

get;set;

}

publicStudent()

{

Console.WriteLine("无参的构造方法");

}

publicStudent(stringname)

{

Name=name;

Console.WriteLine("一个参数的构造方法");

}

publicStudent(stringname,intage)

{

Name=name;

Age=age;

Console.WriteLine("两个参数的构造方法");

}

}

publicclassTest

{

publicstaticvoidMain(string[]args)

{

Students1=newStudent();

Students2=newStudent("Rose");

Students3=newStudent("Rose",23);

}

}

第六课时

上机练习(总结,测试题)

上机一:

(考察知识点为static关键字)

请按照以下要求设计一个Helper帮助类。

要求如下:

3)定义一个Helper静态类,该类中定义四个静态方法,分别用于计算两个整数的和、差、积和商,参数和返回值都为int类型。

4)定义一个测试类,在Main()方法中允许用户输入两个数和运算符,然后通过输入的运算符调用Helper帮助类中相应的方法,并打印出计算结果。

示例代码如下:

classProgram

{

staticvoidMain(string[]args)

{

Console.WriteLine("请输入运算的第一个数");

intnum1=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("请输入运算符");

stringoper=Console.ReadLine();

Console.WriteLine("请输入运算的第二个数");

intnum2=Convert.ToInt32(Console.ReadLine());

//通过输入的运算符选择运算方式

switch(oper)

{

case"+":

Console.WriteLine("两个数的和为:

{0}",

Helper.Sum(num1,num2));break;

case"-":

Console.WriteLine("两个数的差为:

{0}",

Helper.Sub(num1,num2));break;

case"*":

Console.WriteLine("两个数的积为:

{0}",

Helper.Mul(num1,num2));break;

case"/":

if(num2==0)

{

Console.WriteLine("除数不能为0");

}

else

{

Console.WriteLine("两个数的商为:

{0}",

Helper.Division(num1,num2));

};break;

}

Console.ReadKey();

}

}

//静态类

publicstaticclassHelper

{

//加

publicstaticintSum(intnum1,intnum2)

{

returnnum1+num2;

}

//减

publicstaticintSub(intnum1,intnum2)

{

returnnum1-num2;

}

//乘

publicstaticintMul(intnum1,intnum2)

{

returnnum1*num2;

}

//除

publicstaticintDivision(intnum1,intnum2)

{

returnnum1/num2;

}

}

思考题和习题

见教材第四章课后习题

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1