软件开发基础NET第3讲.ppt
- 文档编号:17306248
- 上传时间:2023-07-24
- 格式:PPT
- 页数:48
- 大小:504.50KB
软件开发基础NET第3讲.ppt
《软件开发基础NET第3讲.ppt》由会员分享,可在线阅读,更多相关《软件开发基础NET第3讲.ppt(48页珍藏版)》请在冰点文库上搜索。
软件开发基础(.NET),主讲:
邝颖杰电邮:
第一部分面向对象编程基础,0、本章掌握内容
(2)(计算机专业),类的继承与多态性(理解)接口(理解)委托与事件(重点掌握)反射、序列化和反序列化(了解)推荐书目:
C+Primer(第四版,中文版),1、面向对象基本概念,面向对象是一种模块化的、以对象为基础的设计思想,现在被广泛应用于软件设计领域。
面向对象=对象(Object)+类(Classification)+继承(Inheritance)+通信(Communicationwithmessages,接口调用),1)类,类与对象类:
一组具有相同数据结构和相同操作的对象的集合。
对象(实例):
类的实例化。
注意:
要使用对象,必须先定义类,然后再创建对象。
对象的生存周期对象在建立时分配了内存,创建对象实际上作了两个方面的工作:
(1)使用new保留字要求系统分配内存;
(2)使用构造函数初始化数据。
销毁对象也是做了两个方面的工作:
(1)释放占用的内存;
(2)将分配给对象的内存归还给堆(Heap)。
类的声明,用class定义类,声明类的形式为:
附加声明访问修饰符class类名称:
基类,接口序列字段声明构造函数方法事件,注意:
中的内容可省或任选其一,当两者都有时,先基类后接口,类、字段、构造函数和方法,P66,2)构造函数,作用:
构造函数是一个特殊的方法,用于在建立对象时进行初始化的动作。
好处:
确保每一个对象在被使用之前都适当地进行了初始化的动作。
构造函数特点:
每个类至少有一个构造函数。
若程序代码中没有构造函数则系统会自动提供一个默认的构造函数。
一个构造函数总是和它的类名相同。
构造函数不包含任何返回值。
构造函数总是public的。
一般在构造函数中作初始化工作,对于执行过程用时比较长的程序代码,最好不要放在构造函数中。
2)构造函数,1、默认构造函数
(1)如果在类中不定义构造函数,系统会提供一个默认的构造函数。
(2)默认构造函数没有参数。
(3)默认构造函数自动将非静态成员初始化为:
数值型:
如int、double等,初始化为0。
bool类型:
初始化为false.引用类型:
初始化为null。
(4)如果自己定义了类的构造函数,则所有初始化工作由编程者自己完成。
2)构造函数,2.重载构造函数(P67)有时候可能会遇到这样的情况:
在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。
这时,无参数的构造函数就不能胜任了,解决这个问题最好的办法就是:
重载(Overloading)构造函数。
3)字段和局部变量,字段:
指声明为类一级的对象或值类型的变量。
局部变量:
指在方法、事件以及构造函数内声明的变量。
publicclassProgrampublicstaticintj=20;/字段publicstaticvoidMain()intj=30;/局部变量Console.WriteLine(j);/输出结果:
30Console.WriteLine(Program.j);/输出结果:
20Console.ReadLine();,3)字段和局部变量,当字段和局部变量名相同时,如果要引用静态字段,可以使用下面的形式:
类名.字段名如果是实例字段,则使用下面的形式:
this.字段名这里的this指当前实例。
如果没有出现字段和局部变量名重名的情况,引用字段的形式和引用局部变量的形式相同。
4)静态成员与实例成员,类的成员包括字段、属性、构造函数、方法、事件、索引、嵌套类。
类的成员分静态成员和实例成员静态成员在内存中只有一份静态成员要等到应用程序结束时才会退出内存。
把只有创建了类的实例才能够使用的成员叫实例成员。
5)访问修饰符,Public(常用)任何外部的类都可以不受限制的存取这个类的方法和数据成员。
private(常用)类中的所有方法和数据成员只能在此类中使用,外部无法存取。
(默认)Protected除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。
Internal在当前项目中都可以存取。
该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访问。
Protectedinternal只限于当前项目,或者从该项目的类继承的类才可以存取。
Partial局部类型,类的定义和实现可以分布在多个文件中,但都要使用partial标注,基类只需要声明一次,若多次声明则必须完全一致。
2、结构,结构(struct)是由一系列相关的、但类型不一定相同的变量组织在一起而构成的数据表示形式,所有结构类型都隐式地从类型object继承。
例如:
publicstructPointpublicintx;publicinty;,结构和类的区别与联系,结构类型是值类型,类类型是引用类型。
凡是定义为结构的,都可以用类来定义。
创建轻量级对象时,可以使用结构。
3、方法,1.方法的定义与使用
(1)方法必须放在某个类中。
(2)定义方法的语法形式为:
访问修饰符返回值类型方法名称(参数序列)语句序列,3、方法(续),定义方法时,需要注意以下几点:
方法名不能和变量、常数或者任何声明在类中其它的成员相同。
方法可以有参数,也可以没有参数,但是不论是否有参数,小括号都是必需的。
如果参数序列中的参数有多个,则以逗号分开。
结束某个方法的执行,可以使用return语句,程序遇到return语句后,会将执行流程交还给调用此方法的程序代码段。
此外,还可以用return语句返回一个值。
如果声明一个非void类型的方法,则方法中必须至少有一个return语句。
方法中的参数传递
(1),1)传递值类型的参数值类型参数的格式为:
参数类型参数名2)传递引用类型的参数引用类型参数的格式为:
ref参数类型参数,方法中的参数传递
(2),3)输出多个引用类型的参数输出引用类型参数的格式为:
out参数类型参数名4)传递个数不确定的参数需要传递的参数个数不确定时,可以采用params关键字,其后一般跟一个数组。
classProgrampublicstaticfloatAverage(paramslongv)longtotal,i;for(i=0,total=0;iv.Length;+i)total+=vi;return(float)total/v.Length;staticvoidMain()floatx=Average(1,2,3,5);Console.WriteLine(1、2、3、5的平均值为0,x);x=Average(4,5,6,7,8);Console.WriteLine(4、5、6、7、8的平均值为0,x);Console.ReadLine();,方法重载,方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。
publicstaticintAdd(inti,intj)returni+j;publicstaticstringAdd(strings1,strings2)returns1+s2;publicstaticlongAdd(longx)returnx+5;,4)属性与索引器,属性的作用:
可以限制外部对类中成员变量的存取权限。
1.属性的声明和定义get:
用来读取数据成员的值。
set:
用来设置数据成员的值。
publicclassMyClassprivateintnumber=0;publicintMyNumbergetreturnnumber;setif(value0)number=value;/value是关键字,其值由编译器自动生成。
2.属性的只读和只写PublicintAgeget;privateset;PublicstringStudentNameget;set;,索引器,索引器用于封装内部集合或数组。
索引器在语法上方便了程序员将类、结构或接口作为数组进行访问。
要声明类或结构上的索引器,需要使用this关键字。
例如:
publicintthisintindex/索引器声明/getandsetaccessors,第二部分面向对象的高级编程,1、类的继承与多态性,封装:
隐藏调用者不需要了解的信息。
继承:
简化类的设计。
多态:
类为名称相同的方法提供不同实现方式的能力。
1)基类和扩充类,继承表示现实世界中遗传关系的直接模拟。
它表示类之间的内在联系以及对属性和操作的共享。
1)基类和扩充类,声明扩充类的语法:
访问修饰符class扩充类名称:
基类名称/程序代码扩充类继承了所有定义在基类中数据的定义和方法。
但是扩充类不继承基类的构造函数。
两种实现继承的方式:
类继承和接口继承。
类继承只允许单一继承,接口可实现多重继承。
被继承的类叫基类继承自其他类的类叫扩充类,2)多态性,多态性是指对象可以表示多个类型的能力。
在C#中,多态性的定义是:
同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。
3种实现多态性的方法:
通过继承实现多态性。
通过抽象类实现多态性。
通过接口实现多态性。
2)多态性,1、虚拟方法在基类中,如果想让某个方法或者事件被扩充类重写,可以使用修饰符virtual表明:
publicvirtualvoidmyMethod()/程序代码扩充类则用override重写:
publicoverridevoidmyMethod()/程序代码,使用虚拟方法和重写方法时,要注意下面几个方面:
虚拟方法不能声明为静态的。
Virtual不能和private一起使用。
重写方法的名称、参数个数、类型以及返回值都必须和虚拟方法的一致。
2)多态性(续),2、隐藏基类的方法在扩充类中,可以使用new关键字来隐藏基类的方法,即使用一个完全不同的方法取代旧的方法。
与方法重写不同的是,使用new关键字时并不要求基类中的方法声明为virtual,只要在扩充类的方法前声明为new,就可以隐藏基类的方法。
3.在扩充类直接调用基类的方法使用base关键字,3)抽象类,使用abstract修饰符。
抽象类只能做基类。
抽象类与非抽象类的区别:
第一是抽象类不能直接被实例化,只能在扩充类中通过继承使用,对抽象类使用new运算符会产生编译时错误。
第二个不同点是抽象类可以包含抽象成员,而非抽象类不能包含抽象成员。
当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员。
4)密封类,密封类是指不能被其他类继承的类。
在C#语言中,使用sealed关键字声明密封类。
sealed关键字也可以限制基类中的方法,防止被扩充类重写,带有sealed修饰符的方法称为密封方法。
密封方法同样不能被扩充类中的方法继承,也不能被隐藏。
5)继承过程中构造函数的处理,C#在内部按照下列顺序处理构造函数:
从扩充类依次向上寻找其基类,直到找到最初的基类,然后开始执行最初的基类的构造函数,再依次向下执行扩充类的构造函数,直至执行完最终的扩充类的构造函数为止。
注意:
对于无参数的构造函数,执行不会出现问题。
如果是带参数的构造函数,还需要做相应的处理。
2、版本控制,用C#编写方法时,如果在扩充类中重写基类的方法,需要用override声明;要隐藏基类的方法,需要用new声明,这就是C#进行版本控制的依据。
调用非虚拟方法时不会受到版本的影响调用虚拟方法的实现部分可能会因扩充类的重写而影响执行结果,3)接口,接口的主要特点是只有声明部分,没有实现部分。
接口成员的实现是通过类完成的。
定义在接口中的方法都是public的。
使用interface关键字声明一个接口。
常用的语法是:
访问修饰符interface接口名称/接口体一般情况下,以大写的“I”开头指定接口名,表明这是一个接口。
需要在不相关的类中实现同样的功能时,可以使用接口。
3)接口,2.显示方式实现接口注意:
显示实现接口时,不能通过类的实例进行访问,而必须使用接口实例。
4)委托和事件,1.委托类似与C+中的函数指针,不同的是C+语言的函数指针只能够指向静态的方法,而委托除了可以指向静态的方法之外,还可以指向对象实例的方法。
委托的最大特点是:
它不知道或不关心自己引用的对象的类。
委托的应用:
回调(CallBack)机制、事件处理。
委托的声明和使用例如:
publicdelegatevoidFuncDelegate(stringstr);,4)委托和事件,2.事件事件是响应用户对鼠标、键盘操作或自动执行某个与事件关联的方法的行为。
事件和方法一样具有签名,签名包括名称和参数列表。
事件的签名通过委托类型来定义,为事件定义委托的常用形式为:
publicdelegateMyEventHandler(Objectsender,EventArgse)事件可以使用event关键字进行声明,例如:
publiceventMyEventHandlerTriggerIt;若要引发该事件,可以定义引发该事件时要调用的方法,如下例所示:
publicvoidTrigger()TriggerIt();可以通过“+=”和“-=”运算符向事件添加委托来订阅或取消对应的事件。
5)反射,反射的用途是在程序或装配件中查找有关类型的信息,或者从装配件中读取元数据。
反射包含的大多数类都在System.Reflection命名空间中。
常用的类:
1Type类:
查找有关类型的相关信息。
获取指向给定类型的Type对象有2种常用方式:
(1)使用C#提供的typeof关键字获取指定类型的Type对象,例如:
Typet=typeof(double);
(2)调用Type类的GetType静态方法。
例如:
Typet=Type.GetType(System.Double)。
2.Assembly类在System.Reflection命名空间中定义,它允许程序员访问给定装配件的元数据。
6)序列化与反序列化,序列化获取对象并将其状态信息转换为可存储或可传输形式的过程。
反序列化将对象还原回序列化之前的内容。
序列化和反序列化是一个互逆的过程。
.NETFramework提供的两种序列化技术二进制序列化:
可以保持类型不变,即可以在应用程序的不同调用之间保留对象的状态。
XML和SOAP序列化:
仅序列化公共属性和字段,不保存类型。
6)序列化与反序列化,1、如何序列化一个类:
在类的上方加上Serializable特性即可。
SerializablepublicclassMyClass2、二进制序列化MyClassuser=newMyClass();IFormatterformater=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Create,FileAccess.Write,FileShare.None);formater.Serialize(stream,user);stream.Close();特点:
二进制序列化会将一个类的所有成员变量都进行序列化,包括私有变量、公共属性、方法等。
6)序列化与反序列化,3、二进制反序列化IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Open,FileAccess.Read,FileShare.Read);MyClassc=(MyClass)formatter.Deserialize(stream);stream.Close();特点:
反序列化后,对象c与序列化之前状态完全相同。
6)序列化与反序列化,4、XML序列化
(1)XML序列化仅将对象的公共字段和属性值序列化为XML流,而不转换方法、索引器、私有字段或只读属性(只读集合除外)。
(2)XML序列化不包括类型信息,即不能保证序列化后的对象在被反序列化时,变为同一类型的对象。
(3)XML序列化的实现步骤Class1user=newClass1();user.AccountName=aa;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);StreamWritermyWriter=newStreamWriter(UserInfo.xml);mySerializer.Serialize(myWriter,user);myWriter.Close();,6)序列化与反序列化,(4)XML反序列化的步骤Class1c;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);FileStreammyFileStream=newFileStream(UserInfo.xml,FileMode.Open);c=(Class1)mySerializer.Deserialize(myFileStream);myFileStream.Close();注意:
反序列化一个对象时不会调用构造函数,这一点与创建对象不同。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 开发 基础 NET