收藏 分享(赏)

c#课件第4章 面向对象的高级编程.ppt

上传人:精品资料 文档编号:11246286 上传时间:2020-02-25 格式:PPT 页数:53 大小:893KB
下载 相关 举报
c#课件第4章 面向对象的高级编程.ppt_第1页
第1页 / 共53页
c#课件第4章 面向对象的高级编程.ppt_第2页
第2页 / 共53页
c#课件第4章 面向对象的高级编程.ppt_第3页
第3页 / 共53页
c#课件第4章 面向对象的高级编程.ppt_第4页
第4页 / 共53页
c#课件第4章 面向对象的高级编程.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、11第 4章 面向对象的高级编程 封装、继承与多态 版本控制 接口 委托 泛型处理 22 本章教学目的介绍面向对象高级编程的相关知识,使学生对 C#高级编程有一个感性认识。 本章教学要求( 1)掌握继承、泛型的概念及基本用法;( 2)掌握与实验有关的相关内容,包括封装、继承与多态、泛型处理 ;( 3)了解其他内容。33实验中的问题解答1. 如何添加某个事件(例如窗体的 Shown事件)?如何删除某个事件?答:添加和删除事件均在设计视图下利用属性中的事件完成。2. 使用 textBoxStartAmount.Focus(); 与使用 键让某控件获取焦点有何不同?答:前者用于动态设置,后者用于静态

2、设置。3. 实验 2:private double Caculate(double startAmount, double rate, int count)叠加次数 count是什么意思?答:叠加次数是指到期后将计算出来的利息作为存款再次计算,例如存款时间为 1年,则按年算息叠加次数为 1,按月算息叠加次数为 12,按季度算息叠加次数为 4。4. 实验报告什么时候交?进度如何安排?答:各人根据自己的情况安排进度,完成一个,写一个实验报告。5. 如何定义属性?如何给属性赋值?如何获取属性的值?答:见书上 P59例 3-10444.1 封装、继承与多态封装:隐藏调用者不需要了解的信息。继承:简化类

3、的设计。多态:类为名称相同的方法提供不同实现方式的能力。55封装 模块信息通过类封装 类的成员通过字段、属性、方法、事件封装u私有的用 privateu可以被继承的用 protectedu公共成员用 publicu不要为了方便把什么都定义成 publicu不要为了方便把什么都定义成 static 通过属性进行封装的例子: P73例 4-166封装举例:对象封装了对象的数据以及对这些数据的操作。 对象是属性和操作的组合 对象的表现(服务、接口)和实现细节分开77/MyClass.csusing System;namespace ConsoleTestclass MyClassprivate in

4、t number;public int Numbergetreturn number;setif (value 0)number = value;/Program.csusing System;namespace ConsoleTestpublic class Programpublic static void Main()MyClass me = new MyClass();me.Number = -1;Console.WriteLine(“Number:0“, me.Number);Console.ReadLine();回答: Number输出的值是多少?88练习 (1) Question

5、 47. (单选 )In Object oriented Programming, how would you describe encapsulation?1. The conversion of one type of object to another.2. The runtime resolution of method calls.3. The exposition of data.4. The separation of interface and implementation. 答案: 499继承继承表示现实世界中遗传关系的直接模拟。它表示类之间的内在联系以及对属性和操作的共享。

6、1010继承(续)声明扩充类的语法:访问修饰符 class 扩充类名称:基类名称/程序代码扩充类继承了所有定义在基类中数据的定义和方法。但是 扩充类不继承基类的构造函数 。继承的例子( 1): P76例 4-2 两种实现继承的方式:类继承和接口继承。 类继承只允许单一继承 ,接口可实现多重继承。 被继承的类叫基类 继承自其他类的类叫扩充类1111多态用相同的操作名在一个类层次的不同类中实现不同的功能,相同的消息由同一 (父 )类的不同对象接收时,导致不同的行为。 举例:几何图形类层次中的多态性。其派生类 “圆 ”、 “长方形 ”、 “三角形 ”等都有方法 “求面积 ”。 。几何 图 形圆 三角

7、形几何 图 形圆Shape类GetArea()Rectangle类GetArea()Circle类GetArea() Triangle类GetArea()12121、虚拟方法 在基类中,如果想让某个方法或者事件被扩充类重写,可以使用修饰符 virtual表明:public virtual void myMethod() /程序代码扩充类则用 override重写 :public override void myMethod() /程序代码多态(续)1313/MyClass.csusing System;namespace ConsoleTestclass MyClasspublic virtu

8、al void Hello()Console.WriteLine(“123“);/MyNewClass.csusing System;namespace ConsoleTestclass MyNewClass : MyClassprivate string str = “hello“;public override void Hello()Number = 2;Console.WriteLine(str);1414多态(续) 使用虚拟方法和重写方法时,要注意下面几个方面:虚拟方法不能声明为静态的。Virtual不能和 private一起使用。重写方法的名称、参数个数、类型以及返回值都必须和虚拟

9、方法的一致。 举例 P79页例 4-41515多态(续)2、隐藏基类的方法在扩充类中,可以使用 new关键字来隐藏基类的方法,即使用一个完全不同的方法取代旧的方法。与方法重写不同的是,使用 new关键字时并不要求基类中的方法声明为 virtual,只要在扩充类的方法前声明为new,就可以隐藏基类的方法。1616多态(续)3、抽象类使用 abstract修饰符。抽象类只能做基类。抽象类与非抽象类的区别: 第一是抽象类不能直接被实例化,只能在扩充类中通过继承使用,对抽象类使用 new运算符会产生编译时错误 第二个不同点是抽象类可以包含抽象成员,而非抽象类不能包含抽象成员。当从抽象类派生非抽象类时,

10、这些非抽象类必须具体实现所继承的所有抽象成员。1717补充题目 Question 32. (单选 )以下描述错误的是()1.在 C+中支持抽象类而在 C#中不支持抽象类。2.C+中可在头文件中声明类的成员而在 CPP文件中定义类的成员,在 C#中没有头文件并且在同一处声明和定义类的成员。3.在 C#中可使用 new 修饰符显式隐藏从基类继承的成员。4.在 C#中要在派生类中重新定义基类的虚函数必须在前面加Override。 1818练习( 2)abstract class BaseClass public virtual void MethodA()Console.WriteLine(“Bas

11、eClass“);class Class1: BaseClasspublic void MethodA()Console.WriteLine(“Class1“);class Class2: Class1 在 Main方法中执行下列语句:Class2 o = new Class2();o.MethodA(); 问:执行结果是什么?19194.2 版本控制用 C#编写方法时,如果在扩充类中重写基类的方法,需要用 override声明;要隐藏基类的方法,需要用 new声明,这就是 C#进行版本控制的依据。 调用非虚拟方法时不会受到版本的影响 调用虚拟方法的实现部分可能会因扩充类的重写而影响执行结果。

12、举例: P83 例 4-8 P84 例 4-920204.2 版本控制(续)调用原则:调用继承的最后实现部分的方法P85 例 4-10C#允许派生类包含与基类方法名称相同的方法,规则如下:1) 基类方法必须声明为 virtual2)若派生类中方法前无 new或 override关键字,方法执行按存在 new关键字一样执行3)若派生类中方法前带 new关键字,则此方法被定义为独立于基类的方法4)若派生类中方法前带 override关键字,则派生类调用此方法,而非基类的方法。5)可从派生类中使用 base关键字调用基类方法。2121补充知识: C#面试题public class A public

13、A() Console.WriteLine(“ A” ); public virtual void Fun() Console.WriteLine(“A.Fun()“); public class B: A public B() Console.WriteLine(“B”); public new void Fun() Console.WriteLine(“B.Fun()“); public static void Main() A a = new B(); a.Fun(); /输出结果为: ABA.Fun()22224.3 接口 接口的主要特点是只有声明部分,没有实现部分。 接口成员的实现是

14、通过类完成的。 定义在接口中的方法都是 public的。 使用 interface关键字声明一个接口。常用的语法是:访问修饰符 interface 接口名称/ 接口体一般情况下,以大写的 “ I” 开头指定接口名,表明这是一个接口。 需要在不相关的类中实现同样的功能时,可以使用接口。23234.3 接口 P88 例 4-11 显示方式实现接口 例 4-12注意:显示实现接口时,不能通过类的实例进行访问,而必须使用接口实例。 通过接口实现多继承 例 4-132424补充知识: C#面试题不定项选择题(1) 以下叙述正确的是: A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。 C. 接口

15、不能被实例化。 D. 接口中可以包含已实现的方法。 B、 C(2)以下叙述正确的是:A. 接口和抽象类一样均只能声明,而不能有实现部分。B. 类可以继承多个接口,但仅能从一个抽象类或其它类型的单个类继承。C. 接口中可以定义属性、方法和事件,但只声明不实现。D. 类的多继承可以通过接口实现。B、 C、 D25254.4 委托 类似与 C+中的函数指针,但有很大不同 委托的声明例如:public delegate void FuncDelegate( string str); 委托的使用 具体内容不再详细讲述26264.5 序列化与反序列化 序列化获取对象并将其状态信息转换为可存储或可传输形式的

16、过程。 反序列化将对象还原回序列化之前的内容。 序列化和反序列化是一个互逆的过程。 .NET Framework提供的两种序列化技术二进制序列化XML和 SOAP序列化27274.5 序列化与反序列化1、如何序列化一个类:在类的上方加上 Serializable特性即可。Serializablepublic class MyClass2、二进制序列化MyClass user = new MyClass();IFormatter formater = new BinaryFormatter();Stream stream = new FileStream(“UserInfo.bin“, File

17、Mode.Create, FileAccess.Write, FileShare.None);formater.Serialize(stream, user);stream.Close();特点:二进制序列化会将一个类的所有成员变量都进行序列化,包括私有变量、公共属性、方法等。 28284.5 序列化与反序列化3、二进制反序列化IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream(“UserInfo.bin“,FileMode.Open, FileAccess.Read, FileShare.Read);MyClass c = (MyClass)formatter.Deserialize(stream);stream.Close();特点:反序列化后,对象 c与序列化之前的状态完全相同。2929补充:二进制序列化与反序列化举例保存窗体位置、颜色与数据库连接信息设置3030补充:二进制序列化与反序列化举例 当输入服务器等信息、改变窗体前景色、位置后,退出应用程序,再次启动,可看到仍然是退出前的状态。

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报