第8章 面向对象程序设计基础_第1页
第8章 面向对象程序设计基础_第2页
第8章 面向对象程序设计基础_第3页
第8章 面向对象程序设计基础_第4页
第8章 面向对象程序设计基础_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#程序设计实践教程

C#ProgrammingPractice韩玉民余雨萍主编“物以类聚,人以群分。”

——《战国策》

万事万物皆对象(Everythingisanobject)。

——BruceEckel《Java编程思想》面向对象程序设计基础第8章面向对象程序设计基础第8章8.1类与对象8.2方法8.3字段8.4属性8.5索引器8.6面向对象特性8.1类与对象类(class)是最基础的C#类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例(instance)提供了定义,实例也称为对象(object)。8.1类与对象类(class)是最基础的C#类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例(instance)提供了定义,实例也称为对象(object)。8.1.1类的声明[访问修饰符]class类名称{[成员修饰符]类的成员变量或者成员函数}8.1类与对象8.1.1类的声明【实例8-1】声明鸟类。classBird{publicstringcolor;//颜色

privatefloatspeed;//飞行速度}8.1类与对象构造函数和析构函数是类中比较特殊的两种成员函数,分别用来对对象进行初始化和回收对象资源。对象的生命周期从构造函数开始,从析构函数结束构造函数的名字与类名相同,析构函数的名字也和类名相同,不过析构函数要在名字前加一个波浪号(~)。8.1.2构造函数和析构函数8.1类与对象8.1.2方法的声明【实例8-2】带有构造函数和析构函数的鸟类。8.1类与对象在C#中实例化一个对象时,需要经历下列步骤:①声明引用;②使用new关键字创建类的对象并对其初始化;③将引用指向类的对象。如实例8-2中代码:Birdb1=newBird();Birdb1声明Bird类型的b1引用;newBird()通过调用构造函数实例化Bird对象;使用b1引用到该对象。8.1.3对象的声明和实例化8.1类与对象8.1.3类的声明【实例8-2】带有构造函数和析构函数的鸟类。classStudent{stringstrname;publicStudent(stringname)//一个参数的构造函数

{strname=name;Console.WriteLine("姓名:"+name+"性别:未知

年龄:未知");//输出学生信息}publicStudent(stringname,stringsex)//两个参数的构造函数{strname=name;Console.WriteLine("姓名:"+name+"性别:"+sex+"年龄:未知");//输出学生信息}publicStudent(stringname,stringsex,intage)//三个参数的构造函数{strname=name;Console.WriteLine("姓名:"+name+"性别:"+sex+"年龄:"+age);//输出学生信息}~Student(){Console.WriteLine("学生"+strname+"信息输出完毕!");//输出操作状态提示信息}staticvoidMain(string[]args){Console.WriteLine("输出学生信息:");Studentstu1=newStudent("小张");//实例化类的实例Studentstu2=newStudent("小王","男");//实例化类的实例Studentstu3=newStudent("小冯","男",22);//实例化类的实例}}8.2方法一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块,是类的成员。构造函数和析构函数是类的特殊的方法。声明方法的格式如下:[修饰符][返回值类型]方法名称([参数列表]){[方法体]}8.2.1方法的声明8.2方法8.2.1方法的声明【实例8-4】猫的喜好和本领classCat{publicCat(stringname)//构造函数输出猫的姓名

{Console.WriteLine("我是"+name);}publicvoidinterest()//输出猫的喜好的方法

{Console.WriteLine("我喜欢晒太阳");}publicvoidaction()//输出猫的本领

{Console.WriteLine("我可以捉老鼠");}staticvoidMain(string[]args){Catbigcat=newCat("小花猫");//实例化一个猫类

erest();//输出猫的喜好

Catsmallcat=newCat("大花猫");//实例化一个猫类

smallcat.action();//输出猫的本领

}}图8-3实例方法8.2类与对象它们之间的区别有以下几点:(1)方法前是否有static关键字。(2)静态方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用,而非静态方法则只能通过类的实例才能调用。(3)非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。(4)静态方法中不能使用this关键字。8.2.2静态方法和非静态方法8.2方法8.2.2静态方法和非静态方法【实例8-5】使用静态方法和非静态方法实现加法运算classProgram{publicstaticintAdd1(intx,inty)//定义一个静态方法实现整形数相加

{returnx+y;}publicintAdd2(intx,inty)//定义一个非静态方法实现整形数相加

{returnx+y;}staticvoidMain(string[]args){//通过静态方法输出两个数相加的结果

Console.WriteLine("静态方法:{0}+{1}={2}",23,34,Add1(23,34));Programn=newProgram();//实例化类的对象

//通过实例方法输出两个数相加的结果

Console.WriteLine("实例方法:{0}+{1}={2}",23,34,n.Add2(23,34));}}图8-4静态方法与实例方法8.2类与对象在同一个类中定义多个方法名相同、参数列表(参数类型,参数个数)不同的方法,这样的形式称为方法重载。重载的好处就是不用因为参数的个数和类型不同而去定义不同的函数名。调用时编译器会根据实际传入参数的形式,选择与其匹配的方法执行。8.2.3方法的重载8.2方法8.2.3方法的重载【实例8-6】重载实现整形数相加和字符串连接classProgram{publicintAdd(intx,inty) //定义一个非静态方法实现整形数相加

{returnx+y;}publicstringAdd(stringa,stringb)//定义一个非静态方法实现字符串连接

{returna+b;}staticvoidMain(string[]args){//实例化类的对象

Programn=newProgram(); Programstr=newProgram();//输出两个数相加的结果

Console.WriteLine("{0}+{1}={2}",23,34,n.Add(23,34));//输出两个字符串的连接结果

Console.WriteLine("{0}+{1}={2}","wel","come",str.Add("wel","come"));}}图8-5重载方法8.3字段类中定义的变量和常量叫字段。按照不同的划分方式可分为:静态字段、实例字段、常量字段和只读字段。8.3字段【实例8-7】字段的使用classProgram{stringsentence;//定义字段publicProgram(stringstrsentence)//定义构造函数{sentence=strsentence;//为字段赋初值Console.WriteLine(sentence);//输出字段}}voidMain(string[]args){//实例化类的实例Programenglish=newProgram("英国人说:“我是英国人!”");Programchinese=newProgram("中国人说:“我是中国人!”");}}图8-6字段的使用8.4属性属性与字段的区别有以下几点:(1)属性是逻辑字段,是字段的扩展,并不占用实际的内存;而字段占用内存空间。(2)属性可以被其它类访问;而非public的字段不能被直接访问。(3)属性可以对接受的数据在范围上做限定;而字段不能。8.4属性【实例8-8】属性的使用classPeople{privatestringname;//定义name字段

publicstringName{get;set;}//定义Name自动属性

privateintage; //定义age字段

publicintAge //定义Age属性

{get //设置get访问器

{returnage;}set //设置get访问器

{if(value>0&&value<130)

{age=value;}else{Console.WriteLine("输入数据不合理!");

}}}图8-7属性的使用staticvoidMain(string[]args){Peoplep=newPeople();Console.WriteLine("请输入姓名:");p.Name=Console.ReadLine();Console.WriteLine("请输入年龄:");p.Age=Convert.ToInt16(Console.ReadLine());}}8.5索引器索引器非常类似于属性,也使用get和set方法,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。定义了索引器的类可以像访问数组一样的使用[]运算符访问类的成员。8.5索引器【实例8-9】索引器的使用classPeople{privatestringname;//定义name字段

privatestringpassword;//定义password字段//定义索引器,name字段的索引值为0,password字段的索引值为1publicstringthis[intindex]{get{if(index==0)returnname;elseif(index==1)returnpassword;elsereturnnull;}set{if(index==0)name=value;elseif(index==1)password=value;}}}图8-8索引器的使用staticvoidMain(string[]args){Peoplep=newPeople();Console.WriteLine("请输入姓名:");p[0]=Console.ReadLine();Console.WriteLine("请输入密码:");p[1]=Console.ReadLine();}8.6类的面向对象特性封装就是把客观事物封装成抽象的类,并且可以把数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。在一个对象内部,某些方法或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。8.6.1类的封装8.6类的面向对象特性【实例8-10】封装Computer类classComputer//类的声明{privateboolisRunnnig;//标记运行状态publicboolIsRunning{get;set;}publicvoidOpen(){isRunnnig=true;}publicvoidClose(){isRunnnig=false;}}classProgram//类的使用{staticvoidMain(string[]args){Computercomputer=newComputer();//实例化类Computer的实例computer.Open();//对电脑的启动进行控制if(computer.IsRunning){Console.WriteLine("电脑已启动!");}}}8.6.1类的封装图8-9封装的使用8.6类的面向对象特性在面向对象编程中,被继承的类称为父类或基类,继承的类称为子类或派生类。C#中提供了类的继承机制,但只支持单继承,而不支持多继承,即一个派生类只能有一个基类。继承的语法格式是:[修饰符]class类名:父类名{ [类体]}8.6.2类的继承8.6类的面向对象特性【实例8-11】定义Student类继承Person类publicclassPerson//基类{stringname;intage;publicstringName{get{returnname;}set{name=value;}}publicintAge{get{returnage;}set{age=value;}}publicvoidShow(){Console.WriteLine("我是"+name+",别害怕");}}publicclassStudent:Person//派生类{publicvoidSayHello(){Console.WriteLine("我是学生"+base.Name+",别害怕");}}8.6.2类的继承8.6类的面向对象特性【实例8-11】定义Student类继承Person类8.6.2类的继承classProgram//测试类{publicstaticvoidMain(String[]args){Personp=newPerson();p.Name="张三";p.Age=38;p.Show();Students=newStudent();s.Name="李四";s.Age=16;s.Show();//调用继承的方法

s.SayHello();}}图8-10继承的使用8.6类的面向对象特性多态是同一个行为具有多个不同表现形式或形态的能力。C#提供了两种技术来实现静态多态性,分别为:函数重载和运算符重载。动态多态性是通过虚方法、抽象类、接口来实现的。在父类中使用virtual关键字修饰的方法就是虚方法,在子类中可以使用override关键字对该虚方法进行重写。8.6.3类的多态8.6类的面向对象特性【实例8-12】具有多态性的交通工具类classVehicle{stringname;//定义字段

publicstringName//定义属性为字段赋值

{get{returnname;}set{name=value;}}publicvirtualvoidMove()//定义方法输出交通工具的形态

{Console.WriteLine("{0}都可以移动",this.Name);}}clas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论