《面向对象程序设计(C#)-电子教案-李法平 第5章》由会员分享,可在线阅读,更多相关《面向对象程序设计(C#)-电子教案-李法平 第5章(46页珍藏版)》请在金锄头文库上搜索。
1、,面向对象程序设计(C#),第五章面向对象程序的基本特性,212,目 录,任务5.1 隐藏对象的信息,任务5.2 实现代码复用,任务5.3 使用接口实现行为统一,任务5.4 利用函数重载实现多态,任务5.5 利用抽象方法和虚函数函数重写实现多态,312,任务5.1 隐藏对象的信息,2,1,知识目标,能力目标,封装性 访问区分符,利用封装性实现信息隐藏,412,5.1.1情境描述,Jack在承接了Jam运动商场销售收银系统设计之后,决定到现场去实地调研软件需求,Jack在需求调研的过程中,Jam在给Jack介绍系统的时候,老是在强调商品信息、客户信息、客户销售积分规则及收银销售记录等,Jack在
2、后来对需求进行整理时,意外发现商场销售收银系统居然是现实社会的一系列存在对象及存在对象之间的联系构成的。Jack希望能够采取面向对象及分析对象之间的联系的方法来进行程序设计,在运用C#进行面向对象程序设计之前,他需要先完成以下任务: 1)使用访问区分符 2)利用封装性隐藏数据,第1章目录,在现实社会中,信息属于一个对象的私有属性,具有保密性及隐藏信息,因此对于信息的隐藏相当重要。封装性是面向对象的基本特性,在C#面向对象编程中,利用其访问区分符可以有效的控制数据成员的访问,例如private访问区分符则表示不允许其他类对象访问等。Jack要实现商品信息的封装,需要对商品的字段进行private
3、访问区分符限定,然后利用get和set属性进行字段的访问封装操作。,第1章目录,5.1.2问题分析,1、利用Visual Studio 2010打开任务5.3项目 2、打开Model下面的Goods类,针对Goods类的成员变量进行private访问区分符的封装操作。 3、利用C#的属性进行字段的get及set操作封装,在Visual Studio2010中,可以利用快捷Ctrl+R,Ctrl+E进行选定字段的get及set封装,第1章目录,5.1.3解决方案,712,4、利用Visual Studio 2010中的快捷实现快速的文件字段封装,封装后的代码Goods类如下所示: 5、修改直接访
4、问Goods类中字段的代码。 6、针对Cashier类、CashRegisterGoods类及CashRegister的数据成员进行private限定。 7、利用get和set对Cashier类、CashRegisterGoods类及CashRegister的数据成员进行访问封装操作。,第1章目录,5.1.3解决方案,812,5.1.4知识总结,1、访问区分符 C#中有一些指定声明的成员或类型的可访问性的关键字,叫做访问区分符,C#中的访问修饰符有public、private、protected、internal。 (1)public 全局访问修饰符public可以声明所有类和成员,并且对这些
5、类或成员的的访问不受限制,任何代码都可以访问该类或成员。如大学图书馆是public的,来自任何学校的学生可以参观图书馆和阅读书籍。 (2)private 私有成员修饰符private声明的成员是私有的,只能在类的内部访问。不能用private声明顶级类,如果将一个类声明为private,那么在命名空间中是没有意义的,只能在类的内部才能访问私有成员。一个类的派生类也不能对该类中由private修饰符修饰的成员进行访问.,第1章目录,912,5.1.4知识总结,(3)protected 保护成员修饰符protected声明的成员,只能从所在类和该类派生的派生类可以访问该类的保护成员。 (4)int
6、ernal 内部访问修饰符internal声明的成员只能在包含它的程序集中访问。 上述四种访问修饰符是基本的访问修饰符.由protected和internal组合在一起可以形成一种新的访问修饰符,即内部保护成员修饰符protected internal,用protected internal修饰的成员在同一个程序集的任何代码中都可见,在派生类中也可以见,甚至在其他程序集中也可见.,第1章目录,1012,5.1.4知识总结,2、封装 类的封装将方法和数据包含在一起形成一个独立的单元,通过设定单元内各个成员的特性来控制对成员的访问,简单来讲,封装指的是隐藏类中成员,及方法实现细节的过程。 (1)通
7、过封装隐藏成员 在现实生活中,一个类的属性和方法并不是完全对外公开的,常常有部分属性方法公开,其他代码都可以访问,有部分属性方法部分代码才能访问,有部分属性方法只有对自身类才能访问。 在定义类的时候通过对成员使用访问修饰符修饰就可以达到目的。 (2)通过封装隐藏方法实现细节,第1章目录,1112,5.1.4知识总结,多态 多态指的是同一个操作作用域不同的对象,可以有不同的解释,产生不同的执行结果,可以有静态多态和动态多态两种类型。 静态多态 静态多态又叫编译时多态,就是系统在编译时,根据传递的参数,返回的类型等信息决定选择哪种函数。这种多态性是通过重载来实现的。一般有函数重载,操作符重载。 动
8、态多态 动态多态又叫运行时的多态,指系统在编译时还不能够确定选择哪个重载函数,而是在系统运行的时候,才能根据实际情况决定采用哪个重载函数,,第1章目录,1212,5.1.5应用实践,针对Book类的成员变量进行private访问区分符的封装操作。,第1章目录,1312,任务5.2 实现代码复用,2,1,知识目标,能力目标,继承性 基类 子类,利用继承性实习代码复用,1412,5.2.1情境描述,Jack前期设计的运动商城的系统,遗忘掉了商品顾客信息尤其是会员信息的存储及操作。为此,他需要在现有系统中扩展顾客的管理。Jam的运动商城主要维护2种类型的顾客,一种是普通顾客,另外一种是会员。针对普通
9、顾客,Jam往往关注顾客的姓名、性别、年龄等基本信息;针对会员顾客,Jam还需要关注会员的等级及会员联系方式等信息。Jack利用抽象与封装的特性可以顺利创建出普通顾客类及会员类,然而,这2个类之间重复书写了许多代码。为了实现代码的复用,Jack需要完成以下任务: 1)理解继承 2)创建抽象类 3)创建子类,第1章目录,1512,5.2.2问题分析,代码复用是编程需要解决的问题之一,它有助于提高软件系统的代码维护,减少软件开发的工作量。在面向对象程序设计中,采用继承来实现代码的复用。运动商城的两类顾客信息,可以通过定义顾客基类,提取普通顾客和会员的共同属性及方法,之后在利用顾客基类派生出普通顾客
10、类及会员顾客类。,第1章目录,1612,5.2.3解决方案,1、利用Visual Studio2010 打开任务5.1。 2、在当前项目的Model目录下新建顾客基类Customer。 3、在Customer类中添加属性及行为,主要属性包含姓名,性别,年龄等。 4、利用顾客基类派生出普通顾客子类NormalCustomer,并重新定义积分管理方法。 5、利用顾客基类派生出会员类VIPCustomer,并重新实现派生类 6、在BLL目录下定义CustomerBLL操作类 7、定义普通顾客及会员的操作菜单,代码略 8、在CMainMenu类中增加顾客操作项 ,代码略。 9、运行测试程序。,第1章目
11、录,1712,5.2.4知识总结,1、抽象类 用abstract修饰的类是抽象的类,抽象类的特征是模糊地、广泛的,只是一个抽象的概念,所以抽象类不能作为其他类的基类,也不能创建抽象类的对象,即抽象类不能使用new操作符。 public abstract class Customer public abstract void pay(); ,第1章目录,1812,5.2.4 知识总结,抽象类包含抽象方法,从一个抽象类派生一个非抽象类时,派生类必须实现所有继承的抽象成员。 抽象类的特征: 不能创建抽象类的对象,即不能使用new关键字实例化 抽象类既可以有抽象方法,也可以有非抽象方法,如果派生类没有
12、实现所有的抽象方法,则派生类也必须声明为抽象类。 抽象类不能声明为封装,用abstract关键字修饰的类,不能再用sealed关键字修饰,抽象类不能被实例化,需要派生类实现其抽象方法,而用sealed修饰的封装类不能被继承,引起矛盾。 抽象方法的特征: 抽象方法只能声明在抽象类中,不能在抽象类的外部声明抽象方法 抽象方法的声明没有方法体 抽象方法在派生类中实现,第1章目录,1912,5.2.4 知识总结,2、封装类 如果不想某个类被派生,就用sealed修饰符修饰成封装类。封装类不允许被继承。 public sealed class Good int code; 封装类的主要作用就是为了防止被
13、继承,所以封装类不能用作基类,也不能是抽象类.,第1章目录,2012,5.2.5应用实践,在定义书籍类Book的基础上,派生出子类BestSellerBook,并书籍销售册数计算方法。子类复用基类的代码。,第1章目录,2112,任务5.3 使用接口实现行为统一,2,1,知识目标,能力目标,接口定义 接口方法实现,利用接口创建对象实现行为统一,2212,5.3.1情境描述,Jack完成了运动商场的收银系统的部分功能,然而目前,他只是成功的实现了系统数据在内存中的存储,Jack无法预知将来他的信息是存储到文件还是存储到数据中,为了将来适应将来可能面临的不同存储对象操作,他需要完成一下的任务: 1)
14、创建接口 2)实现接口,第1章目录,2312,5.3.2问题分析,当前的程序设计中,数据的存储是相当重要的,可能数据输出存储到文件中,可能输出到数据库中,同样也可以输出到打印机进行打印输出等。但针对数据输出的概念来时是相同的,不同的介质输出表明他们具备相同的行为。利用接口可以实现相同的行为不同的实现,规范系统的访问,降低类与类之间的耦合程度。 Jack的数据存储问题可以定义统一的输出接口,之后再针对不同的目标进而实现接口中的统一行为即可。,第1章目录,2412,5.3.3 解决方案,1、利用Visual Studio2010打开任务5.2的案例。 2、新建文件文件Operation,用于保存定
15、义的统一接口。 3、针对商品信息,定义通过的存储接口IGoodsOperation。如图所示: 4、针对统一的数据操作方法,进行规范定义,定义后的代码如 5、新建MemoryOperation文件夹,用于操作内存数据。 6、新建商品信息的内存操作类GoodsOperation,并让当前类实现IGoodsOperation接口。 7、在GoodsOperation类中添加静态存储对象List,用于保存内数据。并重新定义操作的方法 8、定义FileOperation文件,用于保存文件操作类的组织。并在FileOperation下定义GoodsOperation,并实现IGoodsOperation
16、。 9、修改BLL下的GoodsBLL.cs类,先实现内存数据的操作处理。 10、运行测试内存数据操作,第1章目录,2512,4.5.3 知识总结,1、接口的含义 接口是引用类型,它定义了所有派生类应该遵守的语法协议或者一组约定,它只包含抽象成员,如事件、方法、属性而不能包含常量、域、构造函数、析构函数和静态成员。而且接口只能包含这些抽象成员的声明。这些抽象成员具体的实现必须在实现该接口的类中。实现接口的类或者结构要与接口的定义严格一致. 一个接口定义一个协议。一个实现了某个接口的类或结构必须符合它的协议。一个接口可以从一个或多个接口继承,而一个类或结构也可以实现一个或者多个接口. 接口在使用的时候和抽象类一样不能被实例化,而由需要实现接口的类来实例化.,第1章目录,2612,4.5.3 知识总结,2、接口的声明 我们用interface关键字声明接口。接口的声明与类的声明类似。接口的定义默认是公有的。语法格式如下: 访问区分符 interface 接口