版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章
面向对象程序设计基础6.1类和对象的基本特性6.2类的建立和实例化6.3继承和派生6.4综合应用6.5自主学习—重载与重写
本章内容面向对象面向过程面向对象分析解决问题所需步骤用函数实现步骤使用时按顺序依次调用函数例如:
汽车启动;
汽车到站;
将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。用“对象”的思想方法来分析和设计程序。什么是对象生活中的“对象”就是东西,任何东西都可以看成是对象把一个东西看成对象,可以孤立地观察它的性质、行为,进而研究它与其他对象的关系。对象颜色型号出厂日期开机切换频道关机在程序中使用对象的概念程序看成是很多对象相互作用的结果。对象处理文件播放声音显示文件类是对象的“蓝图”。类规定了对象的特征。对象是根据“蓝图”生产出的产品。从同一个类产生出的对象具有相同的结构和规格,却在某些特性上有其不同之处。总之,类是现实生活中一类具有共同特征的事物的抽象。类是对象的模板,对象是类的实例。类月饼模型(类)月饼(对象)实例化遥控器控制电视,只需按下按钮就能切换频道不需要知道电视如何接收信号和搜索频道使用者把电视看成一个对象,如同一个“黑盒子”,只需要知道如何操作它即可。面向对象的特点—封装笔记本电脑的封装性:封装了CPU、内存、硬盘、网卡、声卡等提供了USB接口、网卡接口、音频接口等面向对象程序设计的封装性:
将数据、属性、事件和方法集合在一个类中。数据属性事件方法类的定义对象的声明TextBoxtextBox1;对象实例化textBox1=newTextBox();对象属性设置调用方法
textBox1.focus();响应事件
如:“TextBox”类ClassTextBox{
……}textBox1.Name="textBox1";textBox1.Text="我是No.1";voidtextBox1_KeyPress(……){ ……}电视机不断发展黑白
彩色
高清但声音、图像的功能一直延续下来后一代“继承”前一代的功能并有所发展旧电视派生出新电视新电视继承了旧电视面向对象的特点—继承派生派生继承继承基类(父类)
派生类(子类)继承性示例:继承派生CSCircle:继承了CSPoint所有成员新增了数据成员r
方法Set旧款录像机与旧款电视机相连旧款录像机也可与新款电视机相连电视的音频/视频输入输出接口基本不变对象的对外接口稳定对象在各自发展的同时,还可以进行交互。(续)我的对外“接口”稳定同一操作作用于不同的类的对象,将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。面向对象的特点—多态喵汪多态(2)开始讲课开始听课class
类名[:基类]{
数据成员的说明
属性的定义
方法的定义
事件的定义}6.2类的定义默认(省略)时,为internal,只能在当前项目中使用;若为public则可在其他项目中使用放在命名空间(顶级类)创建类文件(顶级类)在哪里定义类?(1)在类Program中定义(嵌套类)在哪里定义类?(2)数据成员(字段):在类中存储信息的成员“轿车”类的数据成员颜色排量出厂日期类型字段名称classCar{Privatestringcolor;
Private
floatdisplacement;
Private
Datetimereleasedate;}访问修饰符成员声明的可选部分指明程序的其他部分如何访问成员成员的访问修饰符访问修饰符访
问
权
限private私有的,只能在其声明的类中可以访问,不能在类之外访问。protected保护的,只能在其声明的类及其派生类中可以访问。internal仅限于此程序(exe或dll)protectedinternalprotected或internal,仅限于此程序或派生类中public公共的,访问不受限制。手机公用电话设计“方法”用于表达对象的动作。“轿车”类的方法动作:行驶ClassCar{ ……
publicvoidRun() { Console.WriteLine(“Runningnow.”); }}访问修饰符返回值类型方法名形式参数列表方法实例1:mymove()方法实例2:printa()6.2.2方法[访问修饰符]返回值类型
方法名([形式参数列表]){
方法体
}返回结果的数据类型调用方法所需的参数及每个参数的数据类型无返回值,返回值类型为void,可省略return语句;有返回值,返回值类型不为void,方法中必须有return语句方法体中使用return语句返回函数值:return表达式;或return(表达式);或return;//可在无返回值时使用参数与返回值方法参数1参数2返回值形参列表位于方法名后的括号内,指明调用该方法所需参数及每个参数的数据类型多个参数间用逗号分隔无参数时,括号不能省略publicvoidRun(stringroad) { Console.WriteLine(“我在”+road+”上行驶”); }形式参数(形参)调用指定对象的方法:对象.方法名([实在参数表])方法调用时:按照实在参数(实参)的顺序,依次将实参传递给对应的形参,二者的数据类型保持一致执行方法中的语句,在遇到return语句时,或者执行完所有语句后,返回调用此方法的程序代码段,同时返回一个值。方法的调用Publicdoublesin(doublex){sx=…x..;returnsx;}
staticvoidMain(string[]args){y=sin(3.14/2);
Console.Write(“结果为”+y);}形参实参classMyclass{publicintSum(intx,inty){returnx+y;}publicfloatAvg(floatinput1,floatinput2){return(input1+input2)/2.0F;}}例
方法的调用staticvoidMain(string[]args){
MyclassmyC=newMyclass();intz=8;
Console.WriteLine("Sum:{0}and{1}is{2}",4,z,myC.Sum(4,z));Console.WriteLine("Avg:{0}and{1}is{2}",4,z,myC.Avg(4,z));}形参实参例6.4方法的调用
staticvoidMain(string[]args){
CSPoint1p1=newCSPoint1();CSPoint1p2=newCSPoint1();p1.SetValue(0,0);p2.SetValue(1,1);doubles=p1.Distance(p2); Console.WriteLine(s);Console.ReadKey();}classCSPoint1{
privatedoublex;
privatedoubley;publicvoidSetValue(inta,intb){x=a;y=b;}publicdoubleDistance(CSPoint1p){
doubles=Math.Sqrt((x-p.x)*(x-p.x)+(y-p.y)*(x-p.y));returns;}}调用方法时(通过参数)将数据传递给被调用方法值形参:参数声明时无修饰符引用形参:用ref修饰符说明输出形参:用out修饰符说明形参数组:用params修饰符说明参数传递car1.Run(“S20高速”);road“S20高速”publicvoidRun(stringroad)无修饰符按值传递过程中,实参和形参各自占用不同的内存空间只把实参的值复制给对应的形参执行期间,形参的值改变对实参无任何影响例6.5值形参例6.5开始调用时:33kx44ly34kx43ly结束调用时:ref修饰符值传递时,实参与形参使用的是相同的内存单元在执行期间,若形参的值发生变化,实参的值也会发生相同的变化引用形参实质上是对应实参的别名,他们相当于同一个变量或对象当形参是引用形参时,定义和调用时都必须使用ref关键字。例6.6引用形参例6.6开始调用时:3kx4ly4kx3ly结束调用时:out修饰符主要用于将数据从被调用函数传递到调用函数。定义和调用时都必须使用out关键字。输出形参m=7,n=-1属性的定义格式访问修饰符同数据成员的5种修饰符根据get和set访问器是否存在,属性分为:[访问修饰符]类型属性名{ [get{get访问器体}] [set{set访问器体}]}读写属性:包含get和set访问器的属性只读属性:只有get访问器的属性只写属性:只有set访问器的属性get访问器:定义属性的读操作!相当于一个具有返回值的无参数方法,需要有return语句返回属性值set访问器:定义属性的写操作!相当于一个只有一个参数并且返回值为void类型的方法学生类属性例6.9classCar{ privatestringcolor1; privatefloatdisplacement1; privateDatetimereleasedate; publicstringColor
{ get{returncolor1;} set{color1=value;}
} publicstringDisplacement
{ get{returndisplacement1}; set{displacement1=value};
}}Value:表示对属性进行写操作时提供的参数car1.Color=“red”;时,value即“red”属性和字段的区别既然可以声明一个public字段以实现读写,为什么还要采用属性?public字段完全放开,任何人都可以对它进行读写而属性控制灵活,若只提供get方法则只支持读;只提供set方法则只支持写;都提供则支持读写。属性与字段的区别1.属性比字段读写提供更多的控制如Car类的releasedate字段,一旦出厂便已确定,我们希望它只读而不能修改。所以把releasedate字段设为private,而提供一个只读的ReleaseDate属性classCar{ …… publicDateTimeReleaseDate
{ get { returnreleasedate; }
} ……}例如,希望为Car类提供一个Age(使用年份)属性,而且随着时间发展,这个属性会不断变化而更新。年份=当前日期-出厂日期提供Age属性:属性的读操作中包含了计算的车龄的操作。且车龄只读,不能人为设置。续2.属性拥有一些方法的特征,让它达到直接读写字段无法达到的效果publicTimeSpanAge{ get
{ return(DateTime.today-ReleaseDate);
}
}创建对象如Carcar1=newCar();6.2.5对象类名对象名=new类名([参数表]);Carcar1;Car1=newCar();类Car的对象car1car1构造函数的作用:对象初始化的专用函数
Fontf1=newFont("黑体",20);Fontf2=newFont("黑体",20,FontStyle.Bold);构造函数的特点:1)构造函数名:构造函数的名称与类名相同,并且不能指定函数类型(也不能使用void)2)可以重载:可以定义多个构造函数总要有不同的地方:或参数个数不同,或参数类型不同的3)构造函数调用:创建对象时系统自动调用,程序中不能直接调用。新车出厂的时候,通过构造函数来初始化其颜色、排量、出厂日期。classCar{……publicCar()//构造函数
{ color=“gray”;//设置新Car对象的颜色
displacement=2.0;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}}构造函数不设返回值可以编写有参数的构造函数,让它根据参数来初始化类的字段构造函数在创建类的对象时,通过new来调用构造函数(续)publicCar()//无参数的构造函数
{ color=“gray”;//设置新Car对象的颜色
displacement=2.0;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}publicCar(stringColor,floatDiaplacement)//有参数的构造函数
{ color=Color;//设置新Car对象的颜色
displacement=Diaplacement;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}Carcar1=newCar();//调用无参数的构造函数Carcar2=newCar(“red”,”2.4”)//调用有参数的构造函数car1:gray,2.0Car2:red,2.4应用例6.5所完成的Student类,当选择“数据赋予对象”按钮时,若成绩小于60分则用MessageBox提示“成绩不及格”;当选择“输出对象数据”按钮时,用MessageBox输出各属性的值。例6.11创建并访问对象例6.12
通过代码在窗体上生成文本框构造函数的作用:对象初始化的专用函数构造函数的特点:1)构造函数名:构造函数的名称与类名相同,并且不能指定函数类型(也不能使用void)2)可以重载:可以定义多个构造函数总要有不同的地方:或参数个数不同,或参数类型不同的3)构造函数调用:创建对象时系统自动调用,程序中不能直接调用。6.2.6构造函数
publicForm1(){ InitializeComponent();}新车出厂的时候,通过构造函数来初始化其颜色、排量、出厂日期。classCar{……publicCar()//构造函数
{ color=“gray”;//设置新Car对象的颜色
displacement=2.0;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}}构造函数不返回值可以编写有参数的构造函数,让它根据参数来初始化类的字段构造函数在创建类的对象时,通过new来调用构造函数(续)publicCar()//无参数的构造函数
{ color=“gray”;//设置新Car对象的颜色
displacement=2.0;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}publicCar(stringColor,floatDiaplacement)//有参数的构造函数
{ color=Color;//设置新Car对象的颜色
displacement=Diaplacement;//设置排量
Releasedate=DateTime.today;//设置出厂日期
}Carcar1=newCar();//调用无参数的构造函数Carcar2=newCar(“red”,”2.4”)//调用有参数的构造函数car1:gray,2.0Car2:red,2.4后一代“继承”前一代的功能但是在功能上又有所发展旧电视派生出新电视新电视继承了旧电视继承和派生派生派生继承继承基类(父类)
派生类(子类)定时开机自动搜索6.3.1基类和派生类定义:在已有类的基础上构造新的类,新类继承了原有类的数据成员、属性、方法和事件原有的类称为基类,新类称为派生类
面向对象程序设计中的继承性基类派生类派生继承派生类基类派生类是基类的一个子集注意:箭头方向Mammal哺乳动物Horse马派生类基类Whale鲸鱼Mammal哺乳动物哺乳动物马鲸鱼齿鲸须鲸豹子哺乳动物的继承关系class派生类名
:基类名{//…}System.Object类是所有类的基类,所有类都隐式派生于Object类。C#编译器会悄悄将Mammal类写为以下代码classMammal:Object{//…}C#中定义的所有类会自动继承Object类的特性,如ToString()方法classMammal
{
publicvoidBreath()//呼吸
{…}
publicvoidSuckleYoung()//哺乳
{…}}classWhale:Mammal{publicvoidSwim()//游泳
{ …}}classHorse:Mammal{publicvoidTrot()//小跑
{ …}}派生类的对象可以作为基类的对象处理定义的派生类对象可以访问基类的公用成员允许将派生类对象赋值给基类对象例派生类的对象
classMammal{publicstringname;publicvoidBreath(){Console.WriteLine(name+"正在呼吸");}publicvoidSuckleYoung(){Console.WriteLine(name+"正在哺乳");}}classHorse:Mammal{publicvoidTrot(){this.Breath();//调用父类的public方法
Console.WriteLine(name+"正在奔跑"); //调用父类的public数据成员
}}staticvoidMain(string[]args){Mammalmammal=newMammal();=“mammal”;mammal.Breath();mammal.SuckleYoung();
Horsehorse=newHorse();
horse.name=“horse”;horse.SuckleYoung();horse.Trot();}子类调用父类的非私有成员在建立派生类的实例对象时,先调用基类的构造函数,再执行派生类的构造函数。例无参数构造函数classMammal{publicMammal(){ Console.WriteLine("我是一只哺乳动物");}//…}classHorse:Mammal{publicHorse(){Console.WriteLine("我是一匹马");}//…}staticvoidMain(string[]args){Horsehorse=newHorse();}public派生类名(派生类构造函数总参数表) :base(基类构造函数参数表){派生类数据成员初始化}例有参数构造函数用base关键字来指定调用一个基类的构造函数。先调用基类的有参数构造函数;然后调用派生类的有参数构造函数
classMammal{privatestringname;publicMammal(){Console.WriteLine("我是一只哺乳动物");}publicMammal(stringmammalName){name=mammalName;Console.WriteLine(mammalName+"是一只哺乳动物");}}classHorse:Mammal{publicHorse(stringname):base(name){ Console.WriteLine(name+"是一匹马");} //…}staticvoidMain(string[]args){Mammalmammal=newMammal("mammal");Horsehorse=newHorse("horse");Console.ReadLine();}委托是一个对象,有了委托,我们可以把方法本身当作参数来传递它引用类实例或者该类的实例方法,或静态方法静态方法:Static关键字说明;调用时用类名直接调用;静态方法只能访问类的静态成员,而不能访问实例成员例委托委托的定义:使用delegate关键字publicdelegatestringMydelegate(stringarg);publicdelegatestringMydelegate(stringarg);classProgram{publicstaticstringDoNothing(strings){returns;}publicstringToLower(strings){returns.ToLower();}publicstaticstringToUpper(strings){returns.ToUpper();}staticvoidMain(string[]args){Mydelegatem1,m2,m3;Programc=newProgram();m1=newMydelegate(Program.DoNothing);m2=newMydelegate(c.ToLower);m3=newMydelegate(Program.ToUpper);strings="TONGJIUniversity";Console.WriteLine(m1(s));Console.WriteLine(m2(s));Console.WriteLine(m3(s));Console.ReadLine();}}在生成一个委托的实例时,必须用一个方法来实例化,而这个方法的参数和返回值必须与委托的一致。程序中的m1,m2,m3是3个Mydelegate类型的引用。它们分别指向了3个方法使用委托的时候,语法就和调用一个方法一样。委托会去调用它所指向的那个方法,从而得到与直接调用方法一致的结果。publicvoidProcessAndPrint(Mydelegatemd,strings){Console.WriteLine(md(s));}将前面的程序稍作修改,加入一个ProcessAndPrint方法由于有了委托机制,只需把操作写成一个方法,然后通过委托,交给ProcessAndPrint来使用。把方法作为参数传递的做法称为“回调”改进接受一个委托和一个字符串作为参数在用委托处理了字符串以后,把它输出到屏幕c.ProcessAndPrint(m1,s);c.ProcessAndPrint(m2,s);c.ProcessAndPrint(m3,s);例6.2定义一个学生类Student数据成员方法学号姓名成绩设置数据成员值输出数据成员值私有公有事件:类/对象向其他类/对象通知发生的相关事情Form1_Click事件是如何定义的?Form1_Click事件应用例6.10设置学生的成绩,当<60时引发事件引发(或发送)事件的类:“发行者”(生产者)处理(或接收)事件的类:“订户”(消费者)自行定义类的事件在类外声明委托
publicdelegatevoid委托;在类定义中:用publicEvent委托事件名语句声明事件合适地方引发
事件名()语句引发事件在对象实例化时:
对象.事件名+=new委托(处理方法)添加事件处理方法代码编写嘀嘀委托除了用于“回调”,最大的用处是支持事件机制事件publicForm1(){this.Click+=newEventHandler(this.Form_C);}//自编写方法privatevoidForm_C(objectsender,EventArgse){MessageBox.Show("您在窗体上单击了鼠标");}类Form1在构造函数中,为事件Click添加了一个处理程序Form1_C()。“+=“作为委托串联运算符把一个方法指派给一个委托,使得调用这个委托就相当于调用这个方法。嘀嘀一个事件就可以同时拥有多个处理程序一个委托可以被指派给多个方法publicForm1(){this.Click+=newEventHandler(this.Form_Click);this.Click+=newEventHandler(this.Form_Click2);}privatevoidForm_Click(objectsender,EventArgse){MessageBox.Show("您在窗体上单击了鼠标");}privatevoidForm_Click2(objectsender,EventArgse){MessageBox.Show("Form_Click2的响应");}构造函数为对象的Click事件指定了两个事件处理程序两个方法的调用顺序就是它们被指派给Click事件的顺序。移除委托C#允许使用+=运算符来进行委托串联;也允许使用-=运算符来移除委托。publicForm1(){EventHandlereh=newEventHandler(this.Form_Click);this.Click+=eh;this.Click+=newEventHandler(this.Form_Click2);this.Click-=eh;}声明一个委托实例(定义一个委托类型)在类中声明这个事件(即产生委托的一个实例)在事件消费者处:在命名空间内:在事件生产者处:编写执行事件的代码public
delegatevoidFailHandler()
;在合适的地方加入引发事件的代码public
eventFailHandlerFail
;public
int成绩{
get
{
returnScore;
}
set
{
Score=value;
if(Score<60)Fail();
}
}订阅或取消事件s.Fail
+=
newFailHandler(Fail_Handler);PublicstaticvoidFail_Handler(){
Console.Write(“不及格”);}委托名事件名关键字:委托声明一个委托的实例,命名为FailHandler订阅事件订阅后,只要事件Fail被触发,就会调用Fail_Handler(1)创建应用程序,添加类StudentclassStudent
{privatestringNo; //学号privatestringName; //姓名privateintScore; //成绩publicvoidSetValue(stringa,stringb,intc)//SetValue方法用于设置各数据成员的值
{No=a;Name=b;Score=c;
}publicvoidPrint()//Print方法用于输出各数据成员的值
{Conso
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年本田面试专业测试题目及答案
- 2026年西湖的绿课后测试题及答案
- 2023南航招飞PAT测试高频错题集 附正确答案+避坑指南
- 2021年5年经验FPGA资深岗笔试面试题库及答案
- 2022中国铁路南宁局招聘笔试历年进面分数线搭配真题答案
- 2026年大脑智力年龄测试题及答案
- 2023年青海盐湖集团考试易错100题及答案解析
- 吉林通化市梅河口五中2025-2026学年高一下学期3月月考生物试卷(含解析)
- 离婚时分割财产协议书
- 喉癌手术后言语康复指南
- 聚异丁烯行业市场调研行情与投资前景价值分析报告2025年
- 标准项目投资合作协议示例
- 列车牵引与制动系统课件 项目六 牵引与制动控制系统
- 门窗安装安全操作规程
- 基于STM32单片机的智能水杯设计
- 动画角色设计韩宇教学课件全套
- 国内实验室安全事故案例
- 幕墙规范知识培训内容
- 电子商务客服规范细则
- 生物实验室生物安全培训课件
- 基于沉浸式体验下的城市形象构建与传播研究-以西安大唐不夜城为例
评论
0/150
提交评论