2023年面向对象编程技术.pdf
《2023年面向对象编程技术.pdf》由会员分享,可在线阅读,更多相关《2023年面向对象编程技术.pdf(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章面向对象编程技术面向对象的程序设计方法是当前程序设计的大势所趋。面向对象的程序设计方法是对结构化程序设计方法的重新结识。在程序的设计中,方法总是与特定的数据结构密切相关的,方法具有对数据结构的访问,特定的方法只合用于特定的数据结构,因此方法与数据结构在编程中应当是一个密不可分的整体,这个整体叫对象。c#通过类、对象、继承、多态等机制形成一个完善的面向对象的编程体系。4.1类和对象类是C#程序设计的基本单位。4.1.1 类和对象概述现实生活中的类是人们对客观对象不断结识而产生的抽象的概念,而对象则是现实生活中的一个个实体。例如,人们在现实生活中接触了大量的汽车、摩托车、自行车等实体,从而产
2、生了交通工具的概念,交通工具就是一个类,而现实生活中的具体的汽车、摩托车自行车等则是该类的对象。血向对象程序设计的类从本质上和人们现实生活中的这一结识过程是相同的。例如在编程实践中,人们经常使用按钮这一控件,每一个具体的按钮是一个按钮对象,而按钮类则是按钮对象的抽象,并且人们把这一抽象用计算机编程语言表达为数据集合与方法集合的统一体,然后再用这个类创建一个个具体的按钮对象。可以把类比作一种蓝图,而对象则是根据蓝图所创建的实例,可以把类比作生产模具,而对象则是由这种模具产生的实例(产品)。所以人们又把对象叫做类的实例。类是对事物的定义,而对象则是该事物自身.在Visual S t udio.N
3、E T集成环境中的,工具箱中的一个个控件,是被图形文字化的可视的类,而把这些控件添加到窗体设计器中后,窗体设计器中的控件则是对象,即由工具箱中的类创建的对象。类是一种数据类型,在C#中,类这种数据类型可以分为两种:一种是由系统提供的预先定义的,这些类在.NET框架类库中;一种是用户定义数据类型。在创建对象之前必须先定义该对象所属的类。然后由类声明对象.类本质上是一种数据类型,所以类的用法与基本数据类型的用法基本相同,事实上,在Vis ualStudio.NET中 像i nt、fl。at等基本数据类型也是特殊的类。那么,用基本数据类型可以声明变量,用类类型也可以声明变量,只但是类类型的变量叫类的
4、对象或类的实例。4.1.2 类定义类定义的格式与结构定义的格式相似,在类定义中需要使用关键字c 1 a ss,其简朴的定义格式为:c 1 a s s 类名 类体“类名”是一个合法的C#标记符,表达数据类型(类类型)名称,“类体”以一对大括号开始和结束,在一对大括号后面可以跟一个分号。例如:c 1 ass stud e nt/类名为 stude n t(叩u b 1 i c string I D;publ i c string N a me;。p u blic b o o l S ex;I上例中,定义了一个名为“stud en t”(学生)的类,类体中涉及学生的学号-(“ID”)、姓名(“Nam
5、 e”)与性别(“Sex”)。在 上 例 的“类体”中声明的数据都使用“pub 1 ic”修饰,“pub 1 i c”(公共的)表达这些数据可以直接进行访问。假如仅从stu d ent”类的定义形式看,其与结构类型除了关键字外几乎没有任何差别。当然这只是为了说明问题方便,这种定义方式并不符合面向对象程序设计的原则,由于类中缺少了对数据的操作。“类体”涉及类中的所有数据及对数据的操作,面向对象程序设计将数据与对数据的操作作为一个整体,以类的形式进行定义,这 种 机 制 叫“封装”。在“类体”中,所有的数据及对数据的操作的集合叫类成员,类成员的种类很多,本章仅 介 绍“字段”、“属性”、“方法”与
6、“构造函数”。“字段”是类定义中的数据,也叫类的变量。在上例中定义的“ID”、“Name”与“Sex”等均为类中的字段。“属性”用于读取和写入“字段”值,“属性”是字段的自然扩展,对用户而言,“属性”等 同 于“字段”自身,对程序员而言,属性是一种读写“字段”的特殊方法。“方法”实质上就是函数,用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定的功能。4.1.3 声明与使用对象定义类之后,可以用定义的类声明对象,声明对象后可以访问对象成员。每一个类对象均具有该类定义中的所有成员,正如每一个整型变量均可以表达同样的数值范围同样。1.声明对象声明对象的格式与声明基本数据类型的格式相同:类
7、名对象名;例如:s t u d e n t S I;/声明,一个学生类对象S I但是,对象声明后,需用“n ew”关键字进行初始化,这样才干为对象在内存中分派保存数据的空间。初始化的格式:对象名=new 类名();例如:S 1 =n e w s t u d e n t();为S 1分派内存空间可以将声明与初始化对象合二为一,例如:s t u d e n t S 1 =n e w s t u d e n t ();/声明对象并初始化2.访问对象访问对象实质是访问对象成员,对对象变量成员的访问与结构变量相同,使 用 运 算符。例如:S l.I D=1 23 45 ;S 1 .N a me=张三;S
8、 l.S e x=t r u e;上面的代码为对象S 1数据成员赋值。可以使用对象变量为另一对象变量整体赋值,例如,“s t u d e n t S 2;S 2=S 1;或 s t u d e n tS 2=S I;这时,不需要使用n e w关键字对“S 2”初始化。可以使用对象中的某一成员。例如:s t r i n g s N a m e =S 1.N a m e ;/将对象S I的N a m e成员值赋给字符串变量s N a m e4.1.4值类型与引用类型类定义的类型与结构定义的类型虽然相似,但这两种类型却有很大的差别,这涉及到C#中变量存储方式的问题。从变量的存储方式看,C#中的变量可
9、以分为值类型变量与引用类型变量。1 .值类型值类型变量直接包含其自身的数据,因此每个值类型变量自身就包具有赋给它的值。在 C#中,内置数据类型除了字符串(s t r i n g)类型与对象(o b j e c t)类型外其余均为值类型。枚举类型与结构类型也是值类型。例 如“i n t x =4 2;,整型变量X就是值类型。2 .引用类型与值类型不同,引用类型变量不包含自身的数据,只是存储对数据的引用,数据保存在内存的其他位置。例如:usi n g S y s t em;cla s s Cl a ssl(c lass Te s t。pu b lie int A;。static v oi d Ma
10、in(s t ri n g|arg s)(。i n I X=42,Y=X;Tes t Tl=new T e s t();“TLA=42;Test T2=TI;Y=100;oT 2,A=1 00;)引用类型与值类型在内存中的存储形式如图4-1 所示。int X=4 2;I 42|Tl.A=4 2;|4 2 的引用|-42图4-1 值类型与引用类型的存储值类型变量可以使用变量来赋值,引用类型变量也可以使用变量来赋值。例如上例中的代码:intX=4 2,Y=X;T est Tl=new Test();T l.A=4 2;Test T2=T1;使用对象变量赋值但是,值类型与引用类型用变量赋值的性质却不
11、同,如图4-2 所示。图4-2 值类型与引用类型用变量赋值从图中可以看到,用变量X”为变量“Y”赋值,是 将“X”所在内存中的值复制给了“Y”;而用变量“T1”为“T2”赋值,则 是 将“T1”对数据的引用复制给了“T2”,即两个对象变量使用的是同一内存中的数据,也就是说,用“T1”为“T2”赋值不需要使用new关键字对对象初始化,也就没有为对象“T2”分派存储数据的内存空间。这样,在改变变量值时,将发生本质差别。例如上例中的代码:Y=1 0 0;/Y 的值为1 0 0,X的值仍是4 2T 2.A=1 0 0;不仅T 2的值为1 0 0,T 1 的值也为1 0 04.1.5 访问控制在上面类定
12、义的例子中,声明类的数据成员(字段)时,均使用public进行修饰,pub lie叫访问修饰符。声明类中的成员时,使用不同的访问修饰符,表达对类成员的访问权限不同,或者说访问修饰符拟定了在什么范围可以访问类成员。C#中最常用的访问修饰符及其意义,如表4-1所示。表 4-1访问修饰符访问修饰符意义P u b lic(公有)访问不受限制,可以被任何其他类访问privat e(私有)访问只限于含该成员的类,即只有该类的其他成员能访问protected(保护)访问只限于含该成员的类、及该类的派生类在类定义中,假如声明成员没有使用任何访问修饰符,则该成员被认为是私有(Priv a te)的。假如不涉及继
13、承,private与protected没有什么区别。在类定义中,假如成员被声明为p riv ate或protected,则不允许在类定义外使用点运算符访问,即在类定义外,点运算符只能访问P ublic成员。例如在下面的类定义中:c 1 ass s tu d en t类名为stud e ntpri v a te s tri n g ID;/私有p ubl i c string Name;公有p ro t e cte d bool S ex;/保护)s tuden t S l=n ew stu den t();S 1.ID=1 2 345;非法,ID 为 p r ivateS 1 .Name=张三
14、;合法,Name 为 p u b 1 i cS 1 .Sex=t rue;/非法,Sex 为 P ro t ected在类定义外使用点运算符访问“ID”与“Sex”是非法的,而访问“Name”则是合法的,由 于 ID 与 S e x 是 pri v ate 或 p r otected 的,而 N am e则是 p ublic 的。通常,在类定义中,数据成员(字段)被声明为pri v a te 或 protec t e d,从而实现所谓的数据隐藏,以保证不能在类外随意访问类的数据成员;而其他种类的成员则被声明为pu b lic,以通过这些成员实现对类的数据成员的访问。4.2属性对私有或保护数据成
15、员常见的访问是读取与设立修改数据值,在类定义外部,这种访问可通过属性成员实现。通过属性可以控制对数据的访问方式,甚至设立数据可接受的值域。4.2.1 声明属性在类定义中声明属性的格式为:访问修饰符类 型 属 性 名 可以将属性声明为读写属性、只读属性或只写属性。1.声明读写属性修改st u den t 类定义添加属性声明:clas s s t u den t类名为s t u d ent。声明字段p r iva t e s t r i n g i d;p r iv a te string n ame;p riva t e bo o 1 s ex;/声明属性publ i c strin g I D
16、(ogeto r e tu r n i d;seta。did=val u e;O d|)p ublic st r i n g N a meIggetreturn name;。setU。nam e=va 1 u e;)public boo 1 Sex。ge tr e tu r n sex;0)s e t(sex=va 1 ue;。)在属性声明中,g e t与s e t叫属性访问器。g e t完毕对数据值的读取,re tu rn用于返回读取的值;se t完毕对数据值的设立修改,v a lu e是一个关键字,表达要写入数据成员的值。属性名应和其要访问的数据成员名相关但不相同,可以采用数据成员名全用小
17、写,而属性名的单词首字母大写的方式,如数据成员名为n a m e,则相应的属性名为N a m e。2.声明只读或只写属性在属性声明中,假如只有g e t访问器,则该属性为只读属性。例如:p u b l i c b o o 1 S e x(g e t(r e t u r n s e x;)只读属性意味着,数据成员的值是不能被修改的。在属性声明中假如只有se t访问器,则该属性为只写属性。只写属性在程序设计中不常使用。4.2.1 使用属性属性成员的使用就如同公有数据成员的使用同样。可认为可写的属性赋值,可以用可读的属性为其他变量赋值。以stud e nt类为例:s t u d e n t S l=
18、n e w s t u d e n t();用属性设立修改数据成员值S 1.I D=1 2 3 4 5;S l.N am e=张三”;S l.S e x =t r u e;/用属性读取数据成员值为其他变量赋值b o o l S S e x=S 1 .S e x;假如属性为只读的,则属性不能出现在赋值运算符的左边。在 C#程序设计中,窗体与控件的属性就是这类成员,其中在属性窗口显示的属性,均为可读写属性,窗体与控件的只读属性只能在代码中使用。4.3 方法方法是把一些相关的语句组织在一起,用于解决某一特定问题的语句块。方法必须放在类定义中。方法同样遵循先声明后使用的规则。4.3.1声明与调用方法方
19、法的使用分声明与调用两个环节。1.声明方法声明方法最常用的格式:访问修饰符返回类型 方 法 名(参数列表)方法的访问修饰符通常是P ublic,以保证在类定义外部可以调用该方法。方法的返回类型用于指定由该方法计算和返回的值的类型,可以是任何值类型或引用类型数据,如,i nt、string及前面定义的s tu d ent 假如方法不返回一个值,则它的返回类型为void。方法名是一个合法的C#标记符。参数列表在一对圆括号中,指定调用该方法时需要使用的参数个数、各个参数的类型,参数之间以逗号分隔。参数可以是任何类型的变量。假如方法在调用时不需要参数,则不用指定参数,但圆括号不能省。实现特定功能的语句
20、块放在一对大括号中,叫方法体,“”表达方法体的开始,“”表达方法体的结束。假如方法有返回值,则方法体中必须包含一个return语句,以指定返回值,该值可以是变量、常量、表达式,其类型必须和方法的返回类型相同。假如方法无返回值,在方法体中可以不包含r e t u r n语句,或包含一个不指定任何值的r e t u r n语句。例如下面的方法声明:p u b l i c i n i I n t M a x (i n t a ,i n t b)(i n t c;i f (a b)。c=a;e l s eo c =b;r e t ur n c;)该方法的功能是求两个整数中较大的整数,并将该整数返回。该
21、方法的返回类型是一个整型值,方法名称为“IntMax”,参数列表中有两个整型变量参数“a”与 b”,方法体中有一 个r e t u m语句,该语句指定的返回值是一个整型变量c。该方法体中的语句块也可以用条件表达式合并为一句:r e t ur n a b?a:b;。这时,r e t ur n指定的返回值是一个条件表达式,r e t ur n语句把该表达式运算的结果返回。2.调用方法从方法被调用的位置,可以分为在方法声明的类定义中调用该方法和在方法声明的类定义外部调用方法。在方法声明的类定义中调用该方法的格式为:方法名(参数列表)在方法声明的类定义中调用该方法,事实上是由类定义内部的其他方法成员调
22、用该方法。例如在类定义内部调用求较大整数函数:c l a s s CLASSMAX(p u b 1 i c i n t G e t M a x(i n t a,i n t b)其他方法成员(o r e t u m I n t M a x(a,b );/在类定义 C L A S S M A X 内部调用方法 I n t M a x)p ub l i c i n t I n t M a x (i n t a ,i n t b)求较大整数函数。r e t ur n a b?a:b ;。)在方法声明的类定义外部调用该方法事实上是通过类声明的对象调用该方法,其格式为:对象名.方法名(参数列表)【例 4-
23、1】创建一个控制台应用程序,并创建一个类,该类仅包含求两个数中较大数的方法成员,在 Main方法中调用该方法。us i n g S y s t e m;c 1 a s s C l a s s i(o c 1 a s s CLASSMAX/定义一个类p u b l i c i n t I n t M a x(i n t a,i n t b )g r et u m ab?a:b;g|)esta t ic v o i d Ma i n(stri ng args)。(。i ntX=4 2,Y;o Y=1 0 0;CLASSMAX cla s smax=new CLASSMAX();/声明一个对象i n
24、t C=classma x.IntMa x(X,Y);/调用对象方法Consol e.Write(较大的值为:”);o Console.W rit e Line(C);00co n s o le.ReadLine();)程序运营的结果为:较大的值为:1004.3.2参数传递在方法的声明与调用中,经常涉及方法参数,在方法声明中使用的参数叫形式参数(形参),在调用方法中使用的参数叫实际参数(实参)。在调用方法时,参数传递就是将实参传递给形参的过程。以【例4-1】为例,声明方法时的形参如下:p ublic int IntM a x(int a,i n t b)调用方法时的实参如下:c 1 a ssm
25、ax.ln t Ma x(X,Y)这样就完毕了形参与实参的结合,其传递关系如图4-3所示。方法调用:cla s smax.I ntMax(X,Y)I!方法声明:public i nt I ntMax(i n t a,int b)图4-3 形参与实参方法参数传递按性质可分为按值传递与按引用传递。1.按值传递参数按值的方式传递是指当把实参传递给形参时,是把实参的值复制(拷贝)给形参,实参和形参使用的是两个不同内存中的值,所以这种参数传递方式的特点是形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。按值传递如图4 4所示。实参 形参-图4-4按值传递示意基本类型的参数在传递时默认为按值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 面向 对象 编程 技术
限制150内