




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章C#面向对象程序设计4.1C#面向对象程序设计基础一、类与对象
1、类的声明格式:
[类修饰符]class类名[:][基类类名][,接口列表]{
类成员;}
几点说明:
(1)类修饰符有:new、public、protected、private、internal、abstract、sealed、partial。①new
仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的与基类中同名的成员类。例4-1用new修饰符隐藏基类中的成员类。②public
表明类可由任何其他类型访问。它和java语言中的public修饰符的用法类似。③protected
一般在嵌套类声明时使用,表示可以在外层类或外层类的子类中使用。
④private
一般在嵌套类声明时使用,被private关键字修饰的内层类只能在外层类范围内使用⑤internal
表明类是一个内部类,内部类必须和访问类在同一程序集中,否则访问类不能访问用internal修饰的类。例如:
//Assembly1.cs,编译成Assembly1.dllinternalclassBaseClass
{publicstaticint
intM=0;}//Assembly2.cs,编译成Assembly2.exe
classTestAccess
{staticvoidMain(){BaseClass
myBase=newBaseClass();//Error}}⑥abstract
表明类是一个抽象类,抽象类不能实例化,只能用作其他类的基类。抽象类的用途是提供多个派生类可共享的基类的公共定义,抽象类中的成员方法只声明不实现。该修饰符的用法与java语言相同。⑦sealed
表明类是一个密封类。密封类不能用作基类,因而关键字sealed和abstract不能同时使用。⑧partial
表明类是一个分部类,分部类允许把类定义拆分到多个文件中。
(2)类修饰符可以两个或多个组合起来使用。如果省略类修饰符,则默认为私有修饰符private。(3)一个类的基类只能有一个(即单继承),但一个类可以实现多个接口。(4)C#中所有的类都直接或间接继承自System.Object类2、对象的声明和实例化
(1)对象的声明格式:类名对象名;
作用:声明一个对象变量。
(2)对象实例化格式:
new类名([实参列表])
作用:调用类的构造函数创建一个对象实例。对象的声明和对象实例化结合起来用下面形式:
类名对象名=new类名([实参列表])
例如:
classA{……}Aa=newA();3、类成员(1)类成员分类在c#中类成员有以下几种:
常量:代表与类相关的常量值;变量:类中的成员变量。方法:完成类的各种功能。属性:用来封装类的域。利用属性完成对类的域的读写操作事件:由类产生的通知,用于说明发生了什么事情。索引指示器:索引器允许类的实例按照与数组相同的方式进行索引,又称下标指示器。运算符:定义类对象能使用的操作符。类型:属于类的局部类型。构造函数:在类被实例化的同时被执行的成员函数,主要是完成对象初始化操作。
析构函数:在类被删除之前最后执行的成员函数,主要是完成对象结束时的收尾操作。
(2)静态成员和非静态成员声明一个类成员时使用了static关键字,则该类成员叫做静态成员,反之叫非静态成员。静态成员和非静态成员的区别:①性质不同静态成员属于类所有,非静态成员属于类的对象所有。②访问方式不同静态成员访问方式:类名.成员名[(参数列表)]
非静态成员访问方式:对象名.成员名[(参数列表)]③静态成员方法和非静态成员方法访问类成员不同静态成员方法只能访问类的静态成员,非静态成员方法既可访问类的静态成员,也可访问类的非静态成员。例4-2静态成员和非静态成员的访问。(3)类成员访问修饰符
在C#中类成员访问修饰符有:public、protected、private、internal。①public
表明类成员是公有成员。公有成员访问不受限制,可以在类内和类外的代码中访问。公有成员提供了类的外部接口。
②protected
表明类成员是保护成员。保护成员可访问域限定于类内或从该类派生的类内,不允许类外代码访问。
③private
表明类成员是私有成员。私有成员可访问域限定于类内,不允许类外和派生类访问。④internal
表明类成员是内部成员。内部成员可访问域限定于类所在的程序集。例4-3类成员访问修饰符的使用。
4、this关键字
this关键字表示引用类的当前实例。
this关键字的常用用途:①限定被相似的名称隐藏的成员。②将this对象作为参数传递到其他方法。③声明索引器。例4-4this关键字的使用。二、类的构造与析构函数
1、构造函数
(1)构造函数的特点
构造函数主要用于为对象分配存储空间,并对数据成员进行初始化。构造函数具有如下特点:①构造函数的名字必须与类同名;②构造函数没有返回类型,它可以带参数,也可以不带参数;③构造函数的主要作用是完成对类的初始化工作;④在创建一个类的对象(使用new关键字)时,编译系统回自动调用类的构造函数初始化对象;(2)实例构造函数
负责初始化类中的实例变量(非静态变量),它只有在用户用new关键字为对象分配内存时才被调用。实例构造函数可以重载。
(3)静态构造函数
静态构造函数用来初始化类的一些静态成员变量。它仅在创建第一个实例或引用任何静态成员之前,由编译系统自动调用,静态构造函数只会被调用一次。在使用静态构造函数的时候应该注意几点:①静态构造函数既没有访问修饰符,也没有参数。②一个类只能有一个静态构造函数。③无参数的构造函数可以与静态构造函数共存。④静态构造函数最多只运行一次。⑤静态构造函数不可以被继承。如果在一个类中既没有定义实例构造函数,又没有定义静态构造函数,则系统会给类自动生成一个实例构造函数和静态构造函数。例4-5构造函数的使用。2、析构函数析构函数在类撤销时运行,常用来处理类用完后的内存的回收工作。使用析构函数时应注意:①析构函数不能带有参数;②析构函数不能拥有访问修饰符;③并且不能显式地被调用,一个对象实例的析构函数在该对象被撤销时自动调用;④析构函数不能被继承和重载;
⑤如果类没有析构函数,编译系统就自动调用默认的析构函数。在C#中,系统提供了垃圾收集器帮助用户完成内存的回收工作,因而一般情况下不需要定义析构函数。
4.2域、属性与事件一、域域又称成员变量。
1、域声明格式:
[域修饰符]类型域名;
域的修饰符有:new、public、protected、internal、private、static和readonly。修饰符public、protected、internal、private和static的用法在前面已讲过。
①newnew修饰符可以显式隐藏从基类继承的同名成员。例如:
publicclassBaseC{publicstaticintx=55;
}
classDerivedC:BaseC{newpublicstaticintx=100;staticvoidMain(string[]args){
Console.WriteLine(x);}
}②readonly
表明域为只读域。只读域只能在域的定义中和它所属类的构造函数中进行修改,在其他情况下是只读的。例如:
classmyClass
{publicreadonlydoublePI=3.14159;……}2、域的初始化
在C#对域初始化有两种方法:①对域声明时初始化。例如:
classmyClass
{publicintx=100;……}②在构造函数中初始化。二、属性
属性是类中的成员,用来读写私有域的值。
1、属性的声明属性声明的格式:
[属性修饰符]属性的类型属性名
{
set{写私有域语句}
get{读私有域语句}}(1)属性修饰符属性修饰符有:new、public、protected、internal、private、static、virtual、override和abstract。
修饰符new、public、protected、internal、private、static和abstract的用法和前面讲的用法基本类似,只是现在用于属性。用virtual修饰属性表明该属性是虚拟属性,虚拟属性可在派生类中重写该属性。override只能用在派生类中修饰重写的属性。例如:
classA{intpvalue=1;
publicvirtualintP{
get{returnpvalue;}set{pvalue=value;}}}
classB:A{publicoverrideintP{get{returnbase.P;}
set{base.P=value;}
}}(2)set访问器
set访问器用来写私有域的值,因而至少包含语句:私有域名=value;(3)get访问器
get访问器用来读私有域的值,因而至少包含语句:
return私有域名;2、属性的访问静态属性的访问格式:
类名.属性名非静态属性的访问格式:对象名.属性名例4-6属性的使用三、事件事件是类在发生其关注的事情时用来通知操作的一种方式。引发事件的操作可能是用户交互(例如鼠标单击),也可能是某些其他的程序逻辑。引发(触发)事件的对象叫做事件发送方。捕获事件并对其做出响应的对象叫做事件接收方。
1、事件的声明事件声明的格式:
[事件修饰符]event委托类型名事件名;
从事件声明的格式来看,声明事件前必须声明一个委托类型名。在命名空间System中预定义了一些委托类型,其中最常见的是EventHandler,其声明是:
publicdelegatevoidEventHandler( Objectsender,
EventArgse)
事件修饰符有:new、public、protected、internal、private和static,这些修饰符的用法和前面讲的类似,只不过现在用于事件。
2、事件的订阅与取消
(1)事件订阅的格式
对象名.事件名+=new委托类型名(事件处理函数名);(2)事件取消的格式对象名.事件名-=new委托类型名(事件处理函数名);例4-7事件的使用
3、事件编程的内容从例4-7可以看出,事件编程包含以下内容:①在事件类中声明一个委托。②在事件类中声明事件。③在事件类中定义触发事件的方法。④在事件类的属性或方法中触发事件。
⑤在访问事件类的程序中定义事件处理函数。⑥在访问事件类的程序中订阅事件。
.NETFramework类库中的类预定义了一些事件,对这些预定义的事件,只需要在访问类的程序中定义事件处理函数和订阅事件。在WindowsForms应用程序中事件订阅的格式:对象名.事件名+=new定义事件的委托类型名(事件处理函数名);在ASP.Net应用程序中事件订阅的格式:
<asp:控件类名Id=id标识符…On事件名=“事件处理函数名”/>4.3方法一、方法的声明
(1)方法声明的格式:
[方法修饰符]返回类型方法名(参数列表){
方法实现部分
}(2)方法修饰符方法修饰符有:new、public、protected、internal、private、static、virtual、sealed、override、abstract和extern。其中修饰符new、public、protected、internal、private、static、virtual、override和abstract的用法和前面讲的类似,只不过现在用于方法。①sealed
表明方法是密封方法。密封方法在派生类中不能被重写。②extern
表明方法是外部方法。extern常用于在非托管代码中调用Dll文件中的函数使用。二、方法的参数
C#支持四种类型的参数,分别为: 值类型:不含任何修饰符;引用类型:使用ref修饰符声明;
输出参数:使用out修饰符声明;参数数组:使用params修饰符声明。
1、值类型参数传递值类型参数传递也称为值传递,就是实参将其值传递给形参,形参值的改变不会引起实参值的改变。例4-8值类型参数的使用。
2、引用类型参数传递
引用类型传递方式下,方法的参数以ref修饰符声明,实参将其引用传递到形参,即实参和形参共用相应的存储空间,因而形参值的改变会引起实参值的改变。例4-9引用类型参数的使用。
3、输出类型参数传递
out关键字会使参数通过引用来传递。这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化。若要使用out参数,方法定义和调用方法都必须显式使用out关键字。使用out关键字修饰形参,需要在方法返回之前给形参赋值。
例如:
classOutExample
{staticvoidMethod(outinti){i=44;
}
staticvoidMain(){
intvalue;Method(outvalue);
Console.WriteLine(value);//输出44}}4、数组类型参数传递数组可作为参数传递给方法。因为数组是引用类型,所以方法可以更改元素的值。例4-10用选择法对6个整数排序。三、方法的重载
方法的重载是指一组具有相似功能的方法具有相同的方法名,只不过参数类型、参数个数和返回值类型不同。
例如:
classMyClass
{publicstaticintmax(intx,inty){if(x>y)returnx;elsereturny;}publicstaticfloatmax(floatx,floaty)
{
if(x>y)returnx;elsereturny;}……}四、外部方法
extern修饰符用于声明在外部实现的方法。extern修饰符的常见用法是在使用Interop
服务调入非托管代码时与DllImport属性一起使用,在这种情况下,该方法还必须声明为static。
例4-11以消息框的形式显示字符串。五、运算符的重载在C#中,允许在一个类中重载标准运算符,目的在于可以用标准运算符运算该类的对象。实现运算符重载,就是在类中定义一个成员方法,格式为:
publicstatic类名operator运算符(形参列表){……}
几点说明:①方法必须用public和static修饰。②返回值类型必须是运算符重载所在的类。形参列表中参数类型也必须是运算符重载所在的类。③方法名必须是operator运算符。④可重载的运算符有:一元运算符:+、-、!、~、++、--、true、false
二元运算符:+、-、*、/、%、&、|、^、<<、>>、==、!=、>、<、>=、<=⑤重载相等运算符(==)时,还必须重载不相等运算符(!=)。<和>运算符以及<=和>=运算符也必须成对重载例4-12定义复数类,重载++和-运算符,并编程测试。4.4索引器索引器允许用户按照与数组相同的方式对类、结构或接口进行索引。索引器定义格式:
public类型this[intindex]{get{读域数组元素语句}
set{写域数组元素语句}}例4-13索引器的使用。4.5继承与多态一、派生类派生类也称子类,其定义格式:
[类修饰符]class类名:基类类名[,接口列表]{
类成员;}
几点说明:
(1)类修饰符有:new、public、protected、private、internal、abstract、sealed、partial。这些修饰符的用法前面已经讲过。
(2)一个类的基类只能有一个(即
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级下册数学教案-1.4《分草莓》北师大版
- 2025年合伙终止合同模板
- Unit 5 animal friends Lesson 5 教学设计 2024-2025学年冀教版(2024)七年级英语上册
- 《山坡羊 潼关怀古》历年中考古诗欣赏试题汇编(截至2022年)
- 2025年河南对外经济贸易职业学院单招职业技能测试题库附答案
- 2024年两系杂交水稻新组合项目资金筹措计划书代可行性研究报告
- 2025年贵阳职业技术学院单招职业技能测试题库一套
- 2025年呼伦贝尔职业技术学院单招职业技能测试题库新版
- 2025年哈尔滨传媒职业学院单招职业技能测试题库含答案
- 2025年度文化旅游景区门面房屋出售及文创产品开发合同
- 《商务沟通-策略、方法与案例》课件 第五章 网络沟通
- 市场调查 第三版 课件全套 夏学文 单元1-8 市场调查认知 - 市场调查报告的撰写与评估
- 身心活化健康评估老年康体指导初级
- 《公共设施设计》课件
- 2024-2030年中国琥珀酸二辛酯磺酸钠产业未来发展趋势及投资策略分析报告
- 《住院患者身体约束的护理》团体标准解读课件
- 现代服务服务费合同范本
- 2024年云南省公务员录用考试《行测》试题及答案解析
- 2024年度-工程造价培训课件全新
- 工业互联网平台的架构与功能
- 高中学校工会工作制度
评论
0/150
提交评论