版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6+章
C#面向对象程序设计本章包含的内容:1)类
2)对象3)参数传递4)继承5)重载、重写和隐藏
6)索引器7)委托8)事件9)运算符重载10)类的转换第6’章
VisualC#语言基础本章重点:1)掌握C#中类声明和对象定义方法;
2)掌握C#中类的构造函数和析构函数的设计方法
;
3)掌握C#中类的静态成员的设计方法;
4)掌握C#中类属性和方法的设计方法;
5)掌握C#中索引器的设计方法;
6)掌握C#中委托的设计方法;
7)掌握C#中事件的设计方法;
8)掌握C#中运算符重载的设计方法;
9)掌握C#中类的转换方法。6+.1类
从计算机语言的角度,类是一种数据类型,对象是具有这种类型的变量。6.1.1类的声明声明格式:[类的修饰符]class类名[:基类名]{//类的成员;
};类的修饰符:public、abstract、sealed、internal。6+.1类
public:公有类,表示对该类的访问不受限制abstract:抽象类,不能建立该类的实例sealed:密封类,不允许从该类派生新的类internal:内部类,只有其所在类才能访问(类只能在当前项目中访问)默认的访问修饰符为internal6+.1类
6.1.2类的成员字段:存储数据,亦称为数据成员。属性:是类中可以像类中的字段一样被访问的方法。可以为类字段提供保护,避免字段在对象不知道的情况下被更改。方法:类可以执行的操作。事件:向其他对象提供有关事件发生通知的一种方式。索引器:允许以类似数组的方式为对象建立索引。运算符:构造函数:析构函数:6+.1类
类成员的访问修饰符:
public、private、protected、internal、readonly。readonly:只读成员,这类成员的值只能读不能写。也就是说,除了赋初值外,将不能修改该成员的值C#中类声明和C++有一个明显的差别是字段可以赋初值。6+.1类
1、数据成员
包括字段、常量和事件语法:[访问修饰符]数据类型成员名例:publicclass
student{privateintsno;privatestringsname;privatestringsex=“男”;conststringstate=“中国”;}6+.1类
2、属性成员
属性是字段的一种自然扩展。与字段不同的是:属性不表示存储位置。属性拥有访问器。
访问器定义了读取或者写入属性值时必须执行的代码。
属性更充分体现了对象的封装性,属性不直接操作类的字段,而是通过访问器进行访问。6+.1类
通过get()和set()访问器来实现对类的私有字段的读写操作。定义属性成员的语法:[访问修饰符]数据类型属性名{get{}set{}
}
修饰符有new、public、protected、internal、private、static、virtual、override和abstract。属性是通过访问器实现的。访问器是字段赋值和检索其值的特殊方法。Set访问器为字段赋值;get访问器检索字段的值。6+.1类
例:classstudent{privatestringname_;publicstringname{get{returnname_;}set{name_=value;}}};6+.1类
例:usingSystemNamespaceprj{publicclassTpoint{intx,y;publicintpx{get{returnx;}set{x=value;}}publicintpy{get{returny;}set{y=value;}}};classProgram{staticvoidMain(string[]
args){Tpointp=newTpoint();p.px=3;p.py=4;Console.WriteLine(“点=>({0},{1}”,p.px,p.py);}}}6+.1类
3、方法成员……6+.1类
4、构造函数与C++相同5、析构函数与C++相同6+.1类
例:定义一个包含构造函数的Point类,表示平面上的点坐标。classPoint{publicintX{get;set;}publicintY{get;set;}publicPoint()
{X=0;Y=2;
}publicPoint(intx,inty)
{X=x;Y=y;}
};6+.1类
classProgram
{staticvoidMain(string[]args)
{PointobjPoint=newPoint();Console.WriteLine("x={0}",objPoint.X);Console.WriteLine("y={0}",objPoint.Y);PointobjPoint2=newPoint(80,90);Console.WriteLine("x={0}",objPoint2.X);Console.WriteLine("y={0}",objPoint2.Y);
}
};6+.1类
6+.1类
例:classPoint{privateintx;privateinty;publicintX{get{returnx;}set{x=value;}}publicintY{get{returny;}set{y=value;}}6+.1类
publicPoint()
{x=0;y=2;
}publicPoint(intx1,inty1)
{x=x1;y=y1;}publicvoidPrint(){console.WriteLine(“坐标({0},{1})”,x,y);}
};6+.1类
classProgram
{staticvoidMain(string[]args)
{PointobjPoint=newPoint();objPoint.Print();objPoint.X=3;objPoint.Y=4;objPoint.Print();PointobjPoint2=newPoint(80,90);objPoint.Print();
intm,n;m=objPoint2.X;n=objPoint2.Y;console.WriteLine(“m={0},n={1}”,m,n);}
};6+.1类
6+.1类
6、静态成员包括静态字段和静态方法。(1)静态字段与c++相同(2)静态方法与c++相同6+.1类
6.1.3分部类分部类可以将类的声明拆分到多个原文件中,被拆分类的每一部分定义的前边都要用partial关键字修饰,并且分部类的每一部分都可以放在不同的文件中。
例:
①
在一个文件中publicpartialclassperson{publicvoidDowork(){//定义方法}};6+.1类
②在另一个文件中
publicpartialclassperson{publicvoidGoToLunch(){//定义方法}};6+.1类
③在第三个文件中
publicpartialclassperson{publicvoidDoRest();//定义分部方法};④在第三个文件中
publicpartialclassperson{publicvoidDoRest();//实现分部方法{//定义方法}};6+.2对象
6.2.1定义类的对象1)定义对象引用类名对象名;例:Personp;2)创建类的实例
对象名=new类名();
例:p=newPerson();通常将对象引用和对象实例合用,甚至通称为对象,但应该了解他们的差异。
上述语句:Person()创建类的实例,然后传递回对该对象的引用并赋给p。定义对象引用和创建实例的过程可以合并。
例:Personp=newPerson();6+.2对象
6.2.2访问对象的字段及属性
对象名.字段名6.2.3调用对象的方法
对象名.方法名(参数列表)6+.3参数传递
C#中方法的参数有4种类型。1.值参数
值传递是C#默认的传递方式,使用值传递方式时,向形式参数(形参)传递的是实在参数(实参)的副本。方法内发生的对形参的更改对实参本身没有影响。2.引用型参数引用型参数本身不创造新的存储空间,而是把实参的地址传给形参。形参和实参指向同一存储单元,对形参的改变就是对实参的改变。引用型参数的实参和形参都必须使用ref修饰。6+.3参数传递
例:PublicclassMyclass{publicvoidaddnum(intnum1,refintnum2){num2=num2+num1;}};ClassProgram{staticvoidMain(string[]args){intx=0;Myclasss=newMyclass();s.addnum(5,refx);Console.WriteLine(x);}};6+.8参数传递
3.输出参数与引用型参数类似,输出参数本身也不创造新的存储空间。它与引用类型参数的差别在于,调用方法前无需对变量(作为输出实参)进行初始化。它用于传递方法返回的数据。输出型参数的实参和形参都必须使用out修饰。6+.3参数传递
例:PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3参数传递
例(思考)PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num1+num2;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3参数传递
例(思考)PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;num2=num1+num2;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3参数传递
4.数组型参数以params修饰符声明的参数属数组型参数。在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。有数组型参数就不能再有ref和out修饰符。6+.3参数传递
例:publicclassMyclass{intnum=10;publicvoidaddnum(refintsum,paramsint[]b){sum=num;foreach(intiteminb)sum+=item;}};classProgram{staticvoidMain(string[]args){int[]a=newint[3]{1,2,3};intx=0;Myclasss=newMyclass();s.addnum(refx,a);Console.WriteLine(x);
}};6+.4继承
通过继承创建派生类的语法:<访问修饰符>class派生类名:基类名{//类的代码}注意:C#中只能单继承,不能多继承。6+.5重载、重写和隐藏
6+.5.1重载
指在同一类中方法的名字相同,但使用不同的数据类型参数或者次序不一致的参数。classPoint{intadd();intadd(intx,inty);};
与C++相同。6+.5重载、重写和隐藏
6+.5.2重写
指在派生类中编写有相同名称和参数的方法。也就是说,重写是指派生类中的方法与基类中的方法具有相同的签名。1、virtual关键字
如果基类中的方法用此关键字修饰,那么在派生类中,就可以重写此方法;如果基类中的方法没有用此关键字修饰,那么在派生类中,就不可以重写此方法。6+.5重载、重写和隐藏
2、重写方法override提供从基类继承的成员的新实现。
通过override声明重写的方法称为重写基方法。重写的基方法必须与override方法具有相同的签名。
不能重写非虚方法、非抽象方法。
被重写的基方法必须是virtual、abstrict和override。6+.5重载、重写和隐藏
例:publicclassPerson{privatestringname;privatestringsex;privatestringid;privateintage;publicvirtualvoidDisplay(){Console.WriteLine(“{0}是{1}性,年龄为{2}”,name,sex,age);}publicvoidDisplay(stringid){this.Display();Console.WriteLine(“身份证号是{0}”,id);}};6+.5重载、重写和隐藏
publicclassStudent:Person{……publicoverridevoidDisplay(){Console.WriteLine(“这是一个学生”);
base.Display();}publicoverridevoidDisplay(stringid){Console.WriteLine(“这是一个学生”);
base.Display(id);}};6+.5重载、重写和隐藏
6+.5.3隐藏
指在派生类隐藏基类中具有相同签名的方法。
在使用新的派生类方法替换基方法时,应使用new关键字。
6+.5重载、重写和隐藏
例:publicclassPerson{privatestringname;privatestringsex;privatestringid;privateintage;publicvoidDisplay(){Console.WriteLine(“{0}是{1}性,年龄为{2}”,name,sex,age);}};6+.5重载、重写和隐藏
publicclassStudent:Person{……publicnewvoidDisplay(){Console.WriteLine(“这是一个学生”);base.Display();}};
如果没有使用new关键字,编译时会给出警告信息:“Student.Display()隐藏了继承的成员Person.Display(),如果是有意隐藏,请使用关键字new”6+.6索引器
6.6.1什么是索引器索引器提供了一种访问类或结构的方法,即允许按照与数组相同的方式对类、结构或接口进行索引。6.6.2定义索引器
需要使用this关键字。格式如下:修饰符
数据类型this[参数类型index]//索引器声明
{//get和set访问器
}
其中:this关键字引用类的当前实例。6+.6索引器
例:带有索引器的University类设计如下:publicclassUniversity{constintMAX=5;privatestring[]name=newstring[MAX];publicstringthis[intindex]//索引器
{get{if(index>=0&&index<MAX)returnname[index];elsereturnname[0];}set{if(index>=0&&index<MAX)name[index]=value;}}};6+.6索引器
classProgram
{staticvoidMain(string[]args)
{Universityuvs=newUniversity();uvs[0]="tsinghua";uvs[1]="beijing";uvs[2]="zhejiang";Console.WriteLine(uvs[2]);
}};6+.6索引器
6’.9索引器
索引器和属性之间的差别:.属性可以通过简单的名称进行访问,索引可以通过索引器进行访问;.属性可作为静态成员或实例成员,索引器必须作为实例成员;.属性的get访问器没有参数,索引器的get访问器具有与索引器相同的形参表;.属性的set访问器包含隐式value参数,索引器的set访问器除value参数外,还具有与索引器相同的形参表。6+.6索引器
例:usingSystem;namespaceprj{classDayCollection{string[]days={“sun”,”mon”,”tues”,”wed”,”thurs”,”fri”,”sat”};privateintGetDay(stringtestDay){inti=0;
foreach(stringdayindays){if(day==testDay)returni;i++;}return-1;}6+.6索引器
publicintthis[stringday]//索引器
{get{return(GetDay(day));}}ClassProgram{staticvoidMain(string[]args){DayCollectionweek=newDayCollection();Console.WriteLine("Fri:{0}",week["Fri"]);Console.WriteLine("Abc:{0}",week["Abc"]);}};}6+.6索引器
6+.7委托
6.7.1什么是委托?
C++等支持函数指针,允许在运行时选择要调用的函数。C#提供具有函数指针功能的结构。通过Delegate类,委托实例可以封装属于可调用实体的方法。委托的特点:
.委托类似于C++函数指针,但它是安全的;
.委托允许将方法作为参数进行传递;
.委托可用于定义回调方法;
.委托可以连接在一起;
.方法不需要与委托签名精确匹配。6+.7委托
6.7.2定义和使用委托1.声明委托类型[修饰符]delegate返回类型委托类型名(参数列表);
例:privatedelegatevoidmydelegate(intn);
声明了一个委托mydelegate,该委托类型可以引用一个采用int作为参数并返回void的方法。
6+.7委托
2.实例化委托1)定义委托对象委托类型名委托对象名;例:mydelegatep;
创建了mydelegate委托的一个委托对象p。
6+.7委托
2)实例化委托对象为调用的方法例:MyDeClass类如下:
classmyDeClass{publicvoidfun1(intn)
{Console.WriteLine(“{0}的2倍={1}”,n,2*n);
}};6+.7委托
可以通过以下语句实例化委托对象p:MyDeClassobj=newMyDeClass();mydelegatep=newmydelegate(obj.fun1);fun1的参数、返回值类型必须与mydelegate类型声明的一致。6+.7委托
3.调用委托
格式如下:委托对象名(实参列表);
例如:p(100);6+.7委托
【例6-3】设计一个控制台应用程序,说明委托的使用。Namespaceprj{delegatedoublemydelegate(doublex,doubley);//声明委托
classMyDeClass{publicdoubleadd(doublex,doubley){returnx+y;}publicdoublesub(doublex,doubley){returnx-y;}publicdoublemul(doublex,doubley){returnx*y;}publicdoublediv(doublex,doubley){returnx/y;}}6+.7委托
ClassProgram{staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep=newmydelegate(obj.add);Console.WriteLine(“5+8={0}”,p(5,8));p=newmydelegate(obj.sub);Console.WriteLine(“5-8={0}”,p(5,8));p=newmydelegate(obj.mul);Console.WriteLine(“5*8={0}”,p(5,8));p=newmydelegate(obj.div);Console.WriteLine(“5/8={0}”,p(5,8));}}}6+.7委托
6+.7委托
前面代码中的委托对象p作为引用类型,也可以改为值类型:staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep=obj.add;Console.WriteLine(“5+8={0}”,p(5,8));p=obj.sub;Console.WriteLine(“5-8={0}”,p(5,8));p=obj.mul;Console.WriteLine(“5*8={0}”,p(5,8));p=obj.div;Console.WriteLine(“5/8={0}”,p(5,8));}}}6+.7委托
6.7.3委托对象封装多个方法委托对象可以封装多个方法,这些方法的集合称为调用列表。委托使用“+”、“-”、“+=”、“-=”等运算符向列表中增加或移除事件处理方法。
6+.7委托
例:namespaceprj{delegatevoidmydelegate(doublex,doubley);//声明委托classMyDeClass{publicvoidadd(doublex,doubley){Console.WriteLine("{0}+{1}={2}",x,y,x+y);}publicvoidsub(doublex,doubley){Console.WriteLine("{0}-{1}={2}",x,y,x-y);}publicvoidmul(doublex,doubley){Console.WriteLine("{0}*{1}={2}",x,y,x*y);}publicvoiddiv(doublex,doubley){Console.WriteLine("{0}/{1}={2}",x,y,x/y);}};6+.7委托
ClassProgram{staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep,a;a=obj.add;p=a;a=obj.sub;p+=a;a=obj.mul;p+=a;a=obj.div;p+=a;p(5,8);}}}6+.7委托
6+.8事件
6.8.1什么是事件
事件是类在发生其关注的事情时用来提供通知的一种方式。6.9.2事件的创建和使用
1.为事件创建一个委托类型事件是通过委托来激活的,其返回值为void型。为事件创建一个委托类型的语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年外研版九年级历史上册月考试卷含答案
- 2025年度农机环保技术合作开发合同范本4篇
- 房屋建筑设计合同(2篇)
- 担保合同补充协议书(2篇)
- 2025年度绿色建筑项目除草与节能合同3篇
- 二零二五年度农机租赁与技术研发服务合同4篇
- 二零二五年度门面房租赁合同(含租金支付方式创新)4篇
- 二零二五版电力设施运行维护合同范本3篇
- 二零二五年度航空航天发动机试验台架租赁合同4篇
- 2025年酒店客房绿植租摆与温馨氛围营造合同3篇
- 数学-山东省2025年1月济南市高三期末学习质量检测济南期末试题和答案
- 中储粮黑龙江分公司社招2025年学习资料
- 湖南省长沙市2024-2025学年高一数学上学期期末考试试卷
- 船舶行业维修保养合同
- 2024年林地使用权转让协议书
- 物流有限公司安全生产专项整治三年行动实施方案全国安全生产专项整治三年行动计划
- 2025届江苏省13市高三最后一卷生物试卷含解析
- 产钳助产护理查房
- 招聘专员转正述职报告
- GB/T 31525-2015图形标志电动汽车充换电设施标志
- 装饰业务员培训教程方案
评论
0/150
提交评论