




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4、5讲,面向对象程序设计基础,本章任务,能正确理解类与对象的概念能使用方法能正确在方法之间传递信息,类和对象,类:类是C#程序设计的基本单位相对对象而言,类似于蓝图包含方法和数据,对象:是类的实例使用关键字new创建对象具有行为,对象,类,类和对象,先有对象还是先有类?类是对象的模板,使用对象前必须先创建类-.Net公共类库中包含大量预先定义好的类-在创建windows应用程序项目时,系统总是自动生成一个Form1类,程序的入口Main方法是该类的一个静态方法。-在windows应用程序运行时,将在main方法中创建一个Form1类的实例,.NET中的类和对象,在VisualStudioIDE环境中,工具箱中的控件是被图形文字化的可视化类,当把这些对象添加到窗体设计器上时,即由类创建了对象。类本质上是一种数据类型,定义类,访问修饰符class类名访问修饰符常量声明;访问修饰符字段声明;访问修饰符方法声明;访问修饰符属性声明;访问修饰符构造函数声明;访问修饰符析构函数声明;,说明:使用类声明可以创建新的类。类声明以一个声明头开始,其组成方式如下:先是指定类的特性或者修饰符,后跟类的名字,它由一组包含在大括号()中的成员声明组成。,例如:定义rectangle类:publicclassrectangle/定义类publicdoublelength;/定义字段publicdoublewidth;/定义字段,类的修饰符,public(公有类):表示外界可以不受限制地对该类访问;private(私有类):表示只有本类才能访问;protected(保护类):表示只能对其所在类和从该类派生的子类进行访问;internal(内部类):表示仅能访问本程序;abstract(抽象类):说明该类可以用来做其他类的基类,可以继承但不能单独使用;Scaled(密封类):说明该类不能作为其他类的基类,不能派生新的类;省略类修饰符则表示为private。,1将类实例化为对象,对象,2类成员的访问,=new();,例如:rectanglerec1=newrectangle();,对象名.数据,例如:rec1.length;,对类名推荐使用Pascal命名规范:每个单词的首字母要大写。创建并初始化对象,属性访问修饰符class;,=new();,总结,定义类,类成员,在类的定义中,包含有各种类成员,概括起来类的成员有两种:存储数据的成员与操作数据的成员。存储数据的成员叫“字段”,操作数据成员又有很多种。“字段”是类定义中的数据,也叫类的变量。“属性”用于读取和写入“字段”值。“方法”实质上就是函数,通常用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定的功能。“构造函数”是在用类声明对象时,完成对象字段的初始化工作。,字段为类中的成员,是表示与对象或类关联的变量,字段常定义的类型有public(公有型)、private(私有型)等。,字段,例如:classtriangle/定义类publicstringname;/字段成员publicdoublesideA;/字段成员publicdoublesideB;/字段成员publicdoublesideC;/字段成员,加上static保留字为静态成员,没有这个保留字的为非静态成员。区别:静态成员属于类所有,非静态成员属于类的对象所有,因此访问静态成员只能由类来访问,而访问非静态成员必须由对象进行访问。,静态字段,静态字段的访问格式:类名.静态成员名,非静态字段的访问格式:对象名.非静态成员名,classTeacherpublicstringnumber=1001;/非静态字段publicstringname=张宁;/非静态字段publicstaticdoublepay=3650.5;/静态字段staticvoidMain(stringargs)Teachert1=newTeacher();stringstr=职工编号:+t1.number+,姓名:++,工资:+Teacher.pay.ToString();Console.WriteLine(str);,例如:,number和name为非静态字段,pay为静态字段,因此访问前面两个字段用对象调用t1.number和,访问最后一个字段用类来调用Teacher.pay。,类的方法表示一类事物所具备的动作,在C#中就是类或对象为完成一项任务而执行的指令序列。在编写程序中使用方法主要是便于修改、增加可读性,方法可以重用和封装。,方法,编写方法,编写方法前的准备工作:该方法主要是实现什么功能?根据功能起一个容易记的方法名。实现该方法需要用户提供什么数据?确定方法的参数。如计算n!,就需要给该方法传入一个整数n。该方法是实现操作或是计算?若是操作,方法的返回类型可以定为void若是计算,需要确定需要给调用者返回一个什么类型的结果。如求n!需要给调用者返回一个长整型的阶乘值。方法的最后一个执行语句应当是:(若是操作可以省略)return表达式;,编写方法,编写方法前的准备工作:该方法可以给哪些人使用:public:所有人都可以使用private:只能给本类使用protected:可以给本类和派生类使用方法要写在类(class)中。,编写方法,方法定义的格式,方法修饰符返回值类型方法名(形参列表)方法体,方法修饰符是可选的。它可以是public,private,protected等之一。默认为private。方法名要符合标识符的命名规则。参数的声明和变量一样,即类型名参数名的格式,用于接收调用者传过来的数值,也相当于方法的局部变量。多个参数之间用逗号分隔。,任务3:根据圆的半径计算圆面积,任务描述:输入圆半径单击“计算”按钮,显示圆面积。,需要定义Circle类自定义方法Area()需要根据参数r计算面积,任务3:根据圆的半径计算圆面积,代码,/定义Circle类publicclassCirclepublicconstdoublePI=3.14159;publicdoubler;publicdoubleArea(doubler)this.r=r;/this.r表示类的字段,r表示方法Area的形参doubles=PI*this.r*this.r;returns;,返回面积,传入半径,代码,/修改“计算”按钮,在其Click事件处理程序privatevoidbtnCompute_Click(objectsender,EventArgse)Circlecircle1=newCircle();doubler=double.Parse(txtR.Text);/将实参r中的值传递给方法area中的形参rdoubles=circle1.Area(r);stringres=园半径是:+circle1.r+厘米,面积是:+s.ToString()+平方厘米;txtResult.Text=res;,方法参数按值传递,publicdoubleArea(doubler),doubles=circle1.Area(r);,方法的声明,方法的调用,调用者,area方法,11.5,11.5,使用以下代码,调用上述方法,结果是什么?,publicdoubleArea(doubler,doubles)this.r=r;s=PI*this.r*this.r;returns;,doublea=0;Circlecircle1=newCircle();doubler=double.Parse(txtR.Text);doubles=circle1.Area(r,a);stringres=半径是:+circle1.r+厘米,面积是:+s.ToString()+平方厘米,+a的值是:+a;txtResult.Text=res;,方法参数按值传递,使用以下代码,调用上述方法,结果是什么?,publicdoubleArea(doubler,refdoubles)this.r=r;s=PI*this.r*this.r;returns;,doublea=0;/必须初始化Circlecircle1=newCircle();doubler=double.Parse(txtR.Text);doubles=circle1.Area(r,refa);stringres=园半径是:+circle1.r+厘米,面积是:+s.ToString()+平方厘米,+a的值是:+a;txtResult.Text=res;,通过引用传递参数,如果要传递原值并修改它,使用引用参数就非常方便。在传递时变量必须被初始化。,publicdoublearea(doubler,outdoubles)this.r=r;s=PI*this.r*this.r;returns;,doublea;/不必初始化Circlecircle1=newCircle();doubler=double.Parse(txtR.Text);doubles=circle1.area(r,outa);stringres=园半径是:+circle1.r+厘米,面积是:+s.ToString()+平方厘米,+a的值是:+a;,通过引用传递参数,在参数前面加一个out关键字,可将该参数设置成一个输出参数,输出参数用来返回一个结果,不必先初始化。,方法的重载,方法重载,就是声明两个以上的同名方法,实现对不同数据类型的相同处理。两点基本要求:1)重载的方法名称必须相同。2)重载的方法,其形参个数或类型必须不同。,例:publicvoidswap(refinta,refintb)publicvoidswap(reffloata,reffloatb)publicvoidswap(reffloata)系统会根据参数的类型或个数,寻求最匹配的方法予以调用。,方法的重载,编译器通过识别方法的签名来区分调用哪个方法。方法的签名包括方法名、参数的类型、个数和顺序对以下重载的方法,编译器能够正确识别:对以下方法,编译器无法识别,会报错:,方法的重载,publicvoidFoo(inta,floatb),publicvoidFoo(floata,intb),publicvoidFoo(inta,intb),publicvoidFoo(intb,inta),方法的重载,属性,属性,从外部(类的使用者)来看,类似于类的字段。从内部(类的作者)来看,类似于类的方法。classTrianglePrivatedoublesideA;publicdoubleSideA/定义SideA属性getreturnsideA;setsideA=value;,get访问器,set访问器,属性是一种用于访问类或对象性质的成员,它与字段不同的是属性不表示存储位置,不直接操作类的数据内容,而是通过访问器进行访问。使用属性可以像使用公共数据成员一样,这样既可以使类中数据被轻松访问,又可以避免随意访问类中公共数据而出现的安全性问题,提高了程序安全可靠性,充分体现了对象的封装性。,属性,如果只提供get访问器,那么这个属性是只读的。如果只提供set访问器,那么这个属性是只写的。建议:将所有字段都定义为private。如果字段需要公开,请使用属性将其公开。,属性,属性的访问方法与类的字段成员的访问方法一样,根据属性声明时是否为静态有下列两种访问形式。非静态属性成员访问:对象名.属性名静态属性成员访问:类名.属性名,属性的使用,属性的使用,/创建对象Triangletri1=newTriangle();s1=double.Parse(txtSideA.Text);s2=double.Parse(txtSideB.Text);s3=double.Parse(txtSideC.Text);/使用属性set访问器写入数据tri1.SideA=s1;tri1.SideB=s2;tri1.SideC=s3;/使用属性get访问器读取数据txtRes.Text=三角形三边长分别为:+tri1.SideA+厘米、+tri1.SideB+厘米和+tri1.SideC+厘米。;,构造函数是特殊的方法,用来实现对象的初始化与类同名没有返回值构造函数用于,当实例化一个对象时,会对类的成员进行初始化。,构造函数,如果我们想使对象初始化时,可以按照设计者的预期来进行,就需要自己书写构造函数的代码。若Triangle类,我们想初始化三边长是0,构造函数可以定义为:classTrianglepublicTriangle(doublesA)/构造函数sideA=sideB=sideC=sA;Triangletri1=newTriangle(0);,构造函数的定义,classTriangleprivatedoublesideA;privatedoublesideB;privatedoublesideC;publicTriangle()/系统默认构造函数publicTriangle(doublesA)/构造函数sideA=sideB=sideC=sA;,构造函数的重载,当没有构造函数时,.NET会提供一个默认空的构造函数。如上例中的Triangle类,会有一个默认构造函数:publicTriangle()/系统默认构造函数编译器只会当类中没有构造函数时,提供一个默认构造函数。但是若提供了其它版本的构造函数,而没有提供默认构造函数,将不能调用默认构造函数。,构造函数的重载,例如上例中没有定义publicTriangle()就不能这样去实例化对象:Triangletri1=newTriangle();,构造函数的重载,析构函数,析构函数也是类的特殊方法,主要用于释放类的实例。析构函数的名字与类名相同,但它的前面需要加一个“”符号;与构造函数不同的是析构函数不能带参数,也没有返回值;当撤消对象时,自动调用析构函数;析构函数不能被继承,也不能被重载。,析构函数声明格式:类名称()语句块例如:classRoundpublicRound()/构造函数publicRound(intr)this.r=r;/构造函数重载Round()/析构函数Console.WriteLine(Round()isrelease);,面向对象编程的重要特性有:封装、继承和多态。封装性是指将数据与对数据的操作作为一个整体,以类的形式进行定义,这种机制叫做“封装”。继承性是指在类之间建立一种关系,即在基类的基础上建立新的类称为派生类,使得新定义的派生类可以继承基类的成员,还可以定义新的成员,建立起类的新层次。多态性是指在类中定义了功能不同但名称相同的方法或属性,通过在类中声明虚拟方法和属性,在派生类中重写这些方法成员的实现,使得调用名称相同的方法成员所执行的操作可能不同,展示出类的多态性。,继承与多态,类的继承,派生类声明格式:Class派生类名:基类名语句块,1派生类与基类派生类是从基类中继承成员,并且添加新成员或重新定义成员,一般称被继承的类为基类或父类,继承后产生的新类称为派生类或子类。基类中构造函数和析构函数不能被派生类继承,其它成员都能被继承。即:派生类具有父类所有的公共属性和方法。,派生类,2基类成员修饰符基类成员修饰符可为public、protected、private其含义如下:public:访问该成员不受任何限制,可以被基类和派生类访问,也可以被外部代码访问。protected:访问该成员仅限于包含它的类和派生类,外部代码不能访问。private:该成员仅限于包含它的类,不能被派生类和外部代码访问。如果不涉及继承,则private和protected没有区别.,C#中类继承规则,派生类只能继承于一个基类。派生类自然继承基类的成员,但不能继承基类的构造函数。基类中的成员声明时,不管是什么访问控制方式,总能被子类继承。访问控制方式只决定了派生类成员是否能访问基类成员。类的继承可以传递,Object类是所有类的基类。,派生类是对基类的扩展,可以声明新的成员,但不能消除已继承的基类成员。派生类定义中,如果声明了与基类同名的成员,则基类中同名的成员将被覆盖。,C#中类继承规则,publicclassPersonprivatestringname;/人物都有姓名privatecharsex;/人物都有性别privateintage;/人物都有年龄publicPerson()publicPerson(stringname,charsex,intage)this.Name=name;this.Sex=sex;this.Age=age;/以下都是封装字段,为了数据的安全;publicstringNamegetreturnname;=value;,publiccharSexgetreturnsex;setthis.sex=value;publicintAgegetreturnage;setthis.age=value;/定义方法,比如吃饭publicvoidEat()Console.WriteLine(Name+正在吃饭!);,/派生类(子类)publicclassZhangSan:PersonpublicZhangSan()/这时,张三这个类就有了父类的公共属性和方法publicZhangSan(stringname,charsex,intage)this.Name=name;this.S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 普通话教学课件效果
- 2025年公务员面试国际发展合作问题与答案
- 2025年安全员应急响应试题
- 2025年安全生产安全应急处理题库及答案
- 同坡屋面画法教学课件
- 2025年工程管理试题及答案解析
- 2025年应急救援员面试精讲题库
- 2025年瑜伽教练进阶实战模拟题与答案详解
- 2025年电子商务运营管理师考试试题及答案解析
- 机电专业知识培训心得课件
- 《全球哮喘管理和预防策略(GINA 2025)》解读
- 2025四川农商联合银行信息科技部社会招聘笔试历年典型考题及考点剖析附带答案详解
- 行为金融学案例
- 万科集团财务管理制度手册207
- “李可中医药学术流派论治厥阴病”-课件
- 通用技术作品设计报告
- 锚杆支护技术规范正式版本
- 隐形眼镜经营管理制度
- 下一代互联网技术
- 皮肤知识与问题性皮肤分析(入行必看)
- 单位消防安全评估报告(模板)
评论
0/150
提交评论