《4 面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《4 面向对象编程基础.ppt(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 面向对象编程基础面向对象编程基础n教学要求n深入理解面向对象概念n掌握类的声明、成员、构造函数和析构函数n掌握方法的声明、参数、重载与覆盖n掌握属性的声明n教学重点n类和对象n构造函数重载n方法的声明、参数、重载与覆盖n教学难点n对类和对象的理解n类的声明、方法的声明及参数n学时分配:6+6教学内容n基本概念n类的定义以及对象的创建n构造函数和析构函数n方法的参数n方法的重载n属性基本概念n面向对象程序设计(OOP)方法强调直接以问题域中的事物为中心来思考和认识问题,并按照这些事物的本质特性把它们抽象为对象,以作为构成软件系统的基础n对象:是系统中用来描述客观事物的一个实体,它有一
2、组属性(用来描述对象静态特征的数据项)和一组行为(用来描述对象动态特征的数据项)构成,是类的特定实例,对象具有下列特征:n标识(Identity):对象各不相同n行为(Behavior):对象可以执行的操作n状态(State):对象可以存储一些随时间变化的信息n类:是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了抽象的描述,其内部包括属性和行为两个主要部分。一个属于某类的对象称为该类的一个实例。n面向对象程序设计方法的核心是类,利用它可以实现对数据和方法的封装,通过类的继承,能够实现对问题的深入抽象描述。n类相当于一种用户自定义的类型,它和前几章提到的基本类型,如浮点型、整形
3、,有类似的特征。n实例化:对象必须实例化后才能使用类与对象的关系示意图12324512245对象对象对象对象类类抽象n抽象是面向对象程序设计的基本原则之一,抽象与具体相对应。n一个汽车的型号就是抽象,它代表了某个汽车的一切属性,包括最大时速,车身长度,全车净重等。抽象就是对具体事物的概括。n抽象是一种从一般的观点看待事物的方法,它要求程序员集中于事物的本质特征,而不是具体细节或具体实现。面向对象鼓励程序员以抽象的观点看待程序,即程序是一组抽象的对象组成的;另一方面又可以将对象的共同特征进一步抽象出来,从而形成“类”的概念。封装封装n所谓“封装”,就是用一个框架把数据和代码组合在一起,形成一个对
4、象。遵循面向对象数据抽象的要求,一般数据都被封装起来,也就是外部不能直接访问对象的数据,外部能见到的只有提供给外面访问的公共操作(也称接口,对象之间联系的渠道)。在C#中,类是支持对象封装的工具,对象则是封装的基本单元。n封装的对象之间进行通讯的一种机制叫做消息传递。消息是向对象发出的服务请求,是面向对象系统中对象之间交互的途径。消息包含要求接收对象去执行某些活动的信息,以及完成要求所需的其他信息(参数)。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。接收者接收了消息,它就承担了执行指定动作的责任,作为消息的答复,接收者将执行某个方法,来满足所接收的请求。继承继承n继承是面向对象编
5、程技术的一块基石,通过它可以创建分等级层次的类。例如,创建一个汽车的通用类,它定义了汽车的一般属性(如:车轮、方向盘、发动机、车门)和操作方法(如:前进、倒退、刹车、转弯等)。从这个已有的类可以通过继承的方法派生出新的子类,卡车、轿车、客车等,它们都是汽车类的更具体的类,每个具体的类还可增加自己一些特有的东西。继承继承n继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。一个基类可以有任意数目的派生类,从基类派生出的类还可以被派生,一群通过继承相联系的类就构成了类的树型层次结构。n如果一个类有两个或两个以上直接基类,这样的继承结构被称为多重继承或多继承。在现实世界中这
6、种模型屡见不鲜,如:一些组合功能的产品像沙发床,它既有沙发的功能,又有床的功能,沙发床应允许同时继承沙发和床的特征。继承继承n尽管多继承从形式上看比较直观,但在实现上多继承可能引起继承操作或属性的冲突。当今的很多语言已不再支持多继承,C#语言也对多继承的使用进行了限制,它通过接口来实现。接口可以从多个基接口继承。接口可以包含方法、属性、事件和索引器。一个典型的接口就是一个方法声明的列表,接口本身不提供它所定义的成员的实现。所以接口不能被实例化,一个实现接口的类再以适当的方式定义接口中声明的方法。多态性多态性n多态性就其字面上的意思是:多种形式或多种形态。在面向对象编程中,多态是指同一个消息或操
7、作作用于不同的对象,可以有不同的解释,产生不同的执行结果。n在面向对象编程中,多态性有两种,一种是静态多态,一种是动态多态。当在同一个类中,直接调用一个对象的方法时候,系统在编译时,根据传递的参数个数、参数类型以及返回值的类型等信息决定实现何种操作,这就是所谓的静态绑定。当在一个有着继承关系的类层次结构中,间接调用一个对象的方法时候,也就是说,调用经过基类的操作,这种调用只有到系统运行时,才能根据实际情况决定实现何种操作,这就是所谓的动态绑定。C#支持这两种类型的多态,在实现多态上C#可以有几种方式:接口多态性、继承多态性、通过抽象类实现的多态性。nC#中,多态是通过虚方法或重载来实现的。类类
8、n对象是面向对象语言的核心,数据抽象和对象封装是面向对象技术的基本要求,而实现这一切的主要手段和工具就是类。n从编程语言的角度讲,类就是一种数据结构,它定义数据和操作这些数据的代码。n把握面向对象编程的重要一步就是区分类与对象,类是对其成员的一种封装,对类进行对象实例化,并在其数据成员上实施操作才是完成现实任务的根本。实例化后的类为对象,其核心特征便是拥有了一份自己特有的数据成员拷贝。这些为对象所持有的数据成员称之为实例成员。不为对象所持有的数据成员称之为静态成员,在类中用static修饰符声明。n类的成员包含数据成员(常量、域、事件)和函数成员(方法、属性、索引器、操作符、构造函数、析构函数
9、等)。类的声明类的声明n要定义一个新的类,首先要声明它,语法形式:语法形式:属性集信息opt 类修饰符opt class 类名:类基 opt 类主体 optn属性集信息:是C#语言提供给程序员为程序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。n类修饰符:可以是以下表3.1所列的几种之一或者是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。类的声明类的声明n类基:它定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object。n最简单的类声明语法形式:语法形式:class 类名 类成员 n例如:clas
10、s Point /Point类的访问权限缺省为public int x,y;类的成员类的成员 n类的定义包括类头和类体两部分,其中类体用一对大花括号 括起来,类体用于定义该类的成员。n类成员由两部分组成,一个是类体中以类成员声明形式引入的类成员,另一个则是直接从它的基类继承而来的成员。类成员声明主要包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等。当字段、方法、属性、事件、运算符和构造函数声明中含有static修饰符时,则表明它们是静态成员,否则就是实例成员。n类成员的访问性:主要是指外部对它的访问权限npub
11、lic:成员可以从任何代码访问。成员可以从任何代码访问。nprotected:成员只能从派生类访问。成员只能从派生类访问。ninternal:成员只能从同一程序集的内部访问。成员只能从同一程序集的内部访问。nprotected internal:成员只能从同一程序集内的派生类访问。成员只能从同一程序集内的派生类访问。nprivate:成员只能在当前类的内部访问成员只能在当前类的内部访问,默认值。默认值。n成员的类型n静态成员:在成员前加static,属于类所有,只能由类来访问n非静态成员:属于类的对象所有,只能由对象进行访问类的成员类的成员n1常数声明常数声明一般语法形式语法形式:访问权限修饰
12、符const 类型 变量名=常数其中:其中:n常数访问权限修饰符可以是:new、public、protected、internal、private。n类型必须是:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型相一致,或者可以通过隐式转换转换成目标类型。n2字段声明字段声明的一般语法形式语法形式:访问权限static类型 变量名=常数n变量声明列表:标识符或者用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值
13、。n静态变量和常量只能由类名来访问,非静态变量只能由对象来访问n只读变量只能在变量定义及其所属类的构造函数中进行修改其值,其他情况下该变量都是只读的,当将其定义为静态的只读变量时,只能在变量定义及其所属类的静态构造函数中进行修改其值。Public Class Studentpublic int a;/公有变量公有变量 public static int c;/静态变量静态变量 private int s_Age;/私有变量私有变量protected int b;/保护的变量保护的变量 const int d=3;/常量常量 public static readonly double PI=3.
14、14/只读变量只读变量变量的初始化n对于静态变量、非静态的对象变量和数组元素,这些变量在自动初始化时都被赋予为本身的默认值。对于所有引用类型的变量,默认值为null,其他类型变量的默认值如表所示。变量类型默认值Sbyte,byte,short,ushort,int,uint,long,ulong0Charx0000Float0.0fDouble0.0dDecimal0.0mBoolFalseenum0举例举例n例:例:通过构造函数对只读字段赋值。using System;public class Areapublic readonly double Radius;/Radius是只读字段pri
15、vate double x,y;/私有字段public double Size;/公有字段public static double Sum=0.0;/静态字段public Area()Radius=1.0;/通过构造函数对radius赋值class Testpublic static void Main()Area s1=new Area();Console.WriteLine(Radius=0,Size=1,Sum=2,s1.Radius,s1.Size,Area.Sum);/静态字段通过类访问Area.Sum,实例字段通过对象访问s1.SizeConsole.Read();构造函数构造函数
16、n 当定义了一个类之后,就可以通过new运算符将其实例化,产生一个对象。为了能规范、安全地使用这个对象,C#提供了对对象进行初始化的方法,这就是构造函数。n在C#中,类的成员字段可以分为实例字段和静态字段,与此相应的构造函数也分为实例构造函数和静态构造函数。n1实例构造函数声明语法形式实例构造函数声明语法形式:属性集信息 opt 构造函数修饰符 opt 标识符(参数列表 opt):base(参数列表 opt)opt :this(参数列表 opt)opt 构造函数语句块 n构造函数修饰符:public、protected、internal、private、extern。n一般地,构造函数总是pu
17、blic类型的。如果是private类型的,表明类不能被外部类实例化。n标识符(参数列表 opt):标识符是构造函数名,必须与这个类同名,不声明返回类型,并且没有任何返回值。这与返回值类型为void的函数不同。构造函数参数可以没有,也可以有一个或多个。这表明构造函数在类的声明中可以有函数名相同,但参数个数不同或者参数类型不同的多种形式,这就是所谓的构造函数重载。构造函数举例构造函数举例n例:例:Time类的构造函数及其重载。using System;public class Timeprivate int hour,minute,second;public Time()hour=minute=
18、second=0;public Time(int h)hour=h;minute=second=0;public Time(int h,int m)hour=h;minute=m;second=0;public Time(int h,int m,int s)hour=h;minute=m;second=s;class Test static void Main()Time t1,t2,t3,t4;/对t1,t2,t3,t4分别调用不同的构造函数 t1=new Time();t2=new Time(8);t3=new Time(8,30);t4=new Time(8,30,30);构造函数构造函
19、数n2.静态构造函数声明语法形式静态构造函数声明语法形式:属性集信息 opt 静态构造函数修饰符 opt 标识符()静态构造函数体 n静态构造函数修饰符:extern static 或者 static extern 如果有extern修饰,则说明这是一个外部静态构造函数,不提供任何实际的实现,所以静态构造函数体仅仅是一个分号。n标识符():标识符是静态构造函数名,必须与这个类同名,静态构造函数不能有参数。n静态构造函数体:静态构造函数的目的是用于对静态字段进行初始化,所以它只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。n静态构造函数是不可继承的,而且不能被直接调用。只有创建类
20、的实例或者引用类的任何静态成员时,才能激活静态构造函数,所以在给定的应用程序域中静态构造函数至多被执行一次。如果类中没有声明静态构造函数,而又包含带有初始设定的静态字段,那么编译器会自动生成一个默认的静态构造函数。静态构造函数举例构造函数举例using System;class Screen static int Height;static int Width;int Cur_X,Cur_Y;static Screen()/静态构造函数,对类的静态字段初始化 Height=768;Width=1024;析构函数析构函数n一般来说,创建一个对象时需要用构造函数初始化数据,与此相对应释放一个对象时
21、就用析构函数。所以析构函数是用于实现析构类实例所需操作的方法,声明语法形式:属性集信息 opt extern opt 标识符()析构函数体 n标识符必须与类名相同,但为了区分构造函数,前面需加“”表明它是析构函数。n析构函数不能写返回类型,也不能带参数,因此它不可能被重载,当然它也不能被继承,所以一个类最多只能有一个析构函数。一个类如果没有显式地声明析构函数,则编译器将自动产生一个缺省默认的析构函数。n析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用。如果这个对象是一个派生类对象,那么在调用析构函数时也会产生链式反应,首先执行派生类的析构函数,然后执行基类的析构函数,如果这个基类还
22、有自己的基类,这个过程就会不断重复,直到调用Object类的析构函数为止,其执行顺序正好与构造函数相反。析构函数举例析构函数举例n例:析构函数的调用次序。using System;public class Point private int x,y;Point()Console.WriteLine(Points destructor);public class Circle:Point private double radius;Circle()/缺省约定调用基类的无参构造函数Point()。Console.WriteLine(Circles destructor );class Test p
23、ublic static void Main()Circle b=new Circle();b=null;GC.Collect();GC.WaitForPendingFinalizers();Console.Read();方法方法n方法的含义方法的含义n方法是按照一定格式组织的一段程序代码,在类中用方法声明方式来定义 n它实现由对象或类执行的计算或操作 n方法的声明语法形式:方法的声明语法形式:方法修饰符 返回类型 方法名(形参表)方法体方法的修饰符方法的修饰符修饰符作用说明备注public表示该方法可以在任何地方被访问访问修饰符protected表示该方法可以在它的类体或派生类中被访问,但不
24、能在类体外访问访问修饰符private表示该方法只能在这个类体内被访问默认值,访问修饰符internal表示该方法可以被同处于一个工程的文件访问访问修饰符protected internal表示该方法可以在它的类体或派生类中被访问,也可以被同处于一个工程的文件访问访问修饰符方法的修饰符方法的修饰符修饰符作用说明备注new在一个继承结构中,用于隐藏基类同名的方法不能与override一起使用virtual表示该方法可以在派生类中重写,来更改该方法的实现不能与static、abstract或override一起使用abstract表示该方法仅仅定义了方法名以及执行方式,但没有给出具体实现,所以包含
25、这种方法的类是抽象类,有待于派生类的实现不能与virtual或static一起使用override表示该方法是将从基类继承的virtual方法的新实现不能与new、virtual、或static一起使用sealed表示这是一个密封方法,它必须同时包含override修饰,以防止它的派生类进一步重写该方法extern表示该方法从外部实现不能与abstract一起使用static表示该方法为静态方法,只能由类名来访问不能与virtual、abstract或override一起使用方法的返回类型及一般格式n(3)返回类型:若有返回值,可以是任何一种C#的数据类型(值类型和引用类型),在方法体内通过r
26、eturn语句来返回;若无返回值,返回值类型用voidn(4)一般声明格式:public static 返回类型 方法名(形参列表)静态方法与实例方法n(1)若一个方法声明中含有static修饰符,则表明这个方法是静态方法,同时说明它只对这个类中的静态成员操作,不可以直接访问实例字段,且只能由类名来调用。n(2)若一个方法声明中不包含static修饰符,则该方法是一个实例方法,实例方法可以直接访问静态字段和实例字段,且只能由对象名来调用。方法声明举例Class Test/定义一个公有的返回值类型为INT型的带两个整型参数的方法Public int max(int x,int y)int z;Z
27、=(xy?x:y;Return z/定义一个无返回值的无参数的静态方法Public static void HellWord()Console.WriteLine(“hello word!”);方法的调用方式n类体内n语句(无返回值):HellWord();n作为表达式(有返回值):m=max(a,b);n作为参数(有返回值):m=max(a,max(b,c);n类体外n语句(无返回值):Test.HellWord();n作为表达式(有返回值):m=T.max(a,b);/Test T=new Test()n作为参数(有返回值):m=T.max(a,T.max(b,c);方法的参数方法的参数n
28、(1)参数的功效:就是能使信息在方法中传入或传出,当声明一个方法时,包含的参数说明是形式参数(形参)。当调用一个方法时,给出的对应实际参量是实在参数(实参),传入或传出就是在实参与形参之间发生的,在C#中实参与形参有四种传递方式。值参数 n不含任何修饰符,在调用时是将实参的值做一个拷贝(开辟新的内存区域),将此拷贝传递给形参,若形参的值发生改变不会影响实参的值。实参可以是变量、常量、表达式,但要求其值的类型必须与形参声明的类型相同或能够被隐式地转化为这种类型,且实参个数与形参个数要相同,顺序也要一致。举例namespace ex3_9 class Myclass public void Sor
29、t(int x,int y,int z)/定义公有的无返回值的带三个整型参数的非静态方法 int tmp;/tmp是方法Sort的局部变量 /将x,y,z按从小到大排序 if(x y)tmp=x;x=y;y=tmp;if(x z)tmp=x;x=z;z=tmp;if(y z)tmp=y;y=z;z=tmp;举例class Test static void Main()Myclass m=new Myclass();/对象实例化 int a,b,c;a=30;b=20;c=10;m.Sort(a,b,c);/方法由对象名调用 Console.WriteLine(a=0,b=1,c=2,a,b,c
30、);Console.Read();(3)引用参数 n在参数前必须加ref,引用参数并不创建新的存储单元,它与方法调用中的实参数变量同处一个存储单元,在方法内对形参的修改就是对外部实参变量的修改。实参必须用ref修饰符且要初始化。举例namespace ex3_11 class Myclass public void Sort(ref int x,ref int y,ref int z)/形参前带了ref int tmp;/tmp是方法Sort的局部变量 /将x,y,z按从小到大排序 if(x y)tmp=x;x=y;y=tmp;if(x z)tmp=x;x=z;z=tmp;if(y z)tmp
31、=y;y=z;z=tmp;举例 class Test static void Main()Myclass m=new Myclass();int a,b,c;a=30;b=20;c=10;m.Sort(ref a,ref b,ref c);/调用时也加了ref Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();输出参数 n在参数前加out,只能用于从方法中传出值,在方法内对形参的修改会影响实参的值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。举例namespace ex3_1
32、2 class Myclass public void MaxMinArray(int a,out int max,out int min,out double avg)int sum;sum=max=min=a0;for(int i=1;i max)max=ai;if(ai min)min=ai;sum+=ai;avg=sum/a.Length;举例class Test static void Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;int smax,smin;double savg;m.M
33、axMinArray(score,out smax,out smin,out savg);Console.Write(Max=0,Min=1,Avg=2,smax,smin,savg);Console.Read();ref参数和out参数使用注意点 nRef和out仅对跟在它后面的参数有效,而不能应用于整个参数表n在调用方法时,也用ref或out修饰实参,要求实参与形参的数据类型必须完全匹配且必须是变量,不能是常量或表达式n在方法外,ref参数必须在调用之前明确赋值,out参数可以有值也可以没值;在方法内,ref参数被视为初始值已赋过,out参数被认为未赋过值、在方法结束之前应对out参数赋值
34、参数数组参数数组n一般而言,调用方法时其实参必须与该方法声明的形参在类型和数量上相匹配,但有时候我们更希望灵活一些,能够给方法传递任意个数的参数,比如在三个数中找最大、最小和在5个数中找最大、最小甚或任意多个数中找最大、最小能使用同一个方法。C#提供了传递可变长度的参数表的机制,即使用params关键字来指定一个参数可变长的参数表。举例namespace ex3_14 class Myclass public void MaxMin(out int max,out int min,params int a)if(a.Length=0)/如果可变参数为零个,可以取一个约定值或产生异常 max=m
35、in=-1;return;max=min=a0;for(int i=1;i max)max=ai;if(ai=y?x:y;public double max(double x,double y)return x=y?x:y;public int max(int x,int y,int z)return max(max(x,y),z);public double max(double x,double y,double z)return max(max(x,y),z);举例 class Test static void Main()Myclass m=new Myclass();int a,b,
36、c;double e,f,g;a=10;b=20;c=30;e=1.5;f=3.5;g=5.5;/调用方法时,编译器会根据实参的类型和个数调用不同的方法。Console.WriteLine(max(0,1)=2,a,b,m.max(a,b);Console.WriteLine(max(0,1,2)=3,a,b,c,m.max(a,b,c);Console.WriteLine(max(0,1)=2,e,f,m.max(e,f);Console.WriteLine(max(0,1,2)=3,e,f,g,m.max(e,f,g);Console.Read();方法的重载与覆盖n(2)在类的层次结构中
37、,只有使用override修饰符,派生类中的方法才可以覆盖(重载)基类的虚方法(virtual),否则用new修饰符来隐藏基类的方法。n(3)不能将虚方法声明为静态的,因为多态性是针对对象的,不是针对类的;不能将虚方法声明为私有的,因为私有方法不能被派生类覆盖;覆盖方法必须与它相关的虚方法匹配,也就是说,它们的方法签名(方法名称、参数个数、参数类型)、返回类型以及访问属性等都应该完全一致;一个覆盖方法覆盖的必须是虚方法。举例namespace ex3_18 class Shape protected double width;protected double height;public Sha
38、pe()width=height=0;public Shape(double x)width=height=x;public Shape(double w,double h)width=w;height=h;public virtual double area()/基类中用virtual修饰符声明一个虚方法 return width*height;public double girth()return 2*(width+height);举例 class Triangle:Shape /三角形 public Triangle(double x,double y):base(x,y)public
39、override double area()/派生类中用override修饰符覆盖基类虚方法 return width*height/2;Public new double grigh()/派生类用new来隐藏基类的方法 return width+height;举例class Test static void Main()Shape A=new Shape(2,4);Triangle B=new Triangle(1,2);Console.WriteLine(A.area=0,A.grith=1,A.area(),A.grith();/调Shape的area和grith方法,8,12Conso
40、le.WriteLine(B.area=0,B.grith=1,B.area(),B.grith();/调Triangle的area和grith方法,1,3 A=B;Console.WriteLine(A.area=0,A.grith=1,A.area(),A.grith();/调Triangle的area方法和Shape的grith方法,1,6 Console.Read();属性属性 n为了实现良好的数据封装和数据隐藏,类的字段成员的访问属性一般设置成private或protected,这样在类的外部就不能直接读写这些字段成员了,通常的办法是提供public级的方法来访问私有的或受保护的字段
41、。举例举例n例:下面程序中的TextBox类提供公共方法set_text和get_text来访问私有数据text。using System;class TextBox private string text;private string fontname;private int fontsize;private bool multiline;public TextBox()text=text1;fontname=宋体;fontsize=12;multiline=true;public void set_text(string str)text=str;public string get_tex
42、t()return text;class Test static void Main()TextBox Text1=new TextBox();Console.WriteLine(Text1.text=0 ,Text1.get_text();Text1.set_text(这是文本框);Console.WriteLine(Text1.text=0 ,Text1.get_text();Console.Read();属性属性n但C#提供了属性(property)这个更好的方法,把字段域和访问它们的方法相结合。对类的用户而言,属性值的读写与字段域语法相同,对编译器来说,属性值的读写是通过类中封装的特别
43、方法get访问器和set访问器实现的。属性的声明语法形式:属性集信息 opt 属性修饰符 opt 类型 成员名 访问器声明 n属性修饰符:属性修饰符与方法修饰符相同,包括new、static、virtual、abstract、override和四种访问修饰符的合法组合,它们遵循相同的规则。n类型:指定该声明所引入的属性的类型。n成员名:指定该属性的名称。n访问器声明:声明属性的访问器,可以是一个get访问器或一个set访问器,或者两个都有。访问器声明语法形式语法形式n读访问器get /访问器语句块 n写访问器set /访问器语句块 nget访问器的返回值类型与属性的类型相同,所以在语句块中的r
44、eturn语句必须有一个可隐式转换为属性类型的表达式。nset访问器没有返回值,但它有一个隐式的值参数,其名称为value,value的类型与属性的类型相同。n同时包含get和set访问器的属性是读写属性,只包含get访问器的属性是只读属性,只包含set访问器的属性是只写属性。属性举例属性举例n例:例:对TextBox类的text、fontname、fontsize、multiline域提供属性方式的读写访问。using System;class TextBoxprivate string text;private string fontname;private int fontsize;pr
45、ivate bool multiline;public TextBox()text=text1;fontname=宋体;fontsize=12;multiline=false;属性举例属性举例 public string Text /Text属性,可读可写get return text;set text=value;public string FontName /FontName属性,只读属性get return fontname;public int FontSize /FontSize属性,可读可写get return fontsize;set fontsize=value;属性举例属性举
46、例 public bool MultiLine /MultiLine属性,只写set multiline=value;class Teststatic void Main()TextBox Text1=new TextBox();/调用Text属性的get访问器Console.WriteLine(Text1.Text=0 ,Text1.Text);Text1.Text=这是文本框;/调用Text属性的set访问器Console.WriteLine(Text1.Text=0 ,Text1.Text);Console.WriteLine(Text1.Fontname=0 ,Text1.FontName);Text1.FontSize=36;Text1.MultiLine=true;Console.WriteLine(Text1.FontSize=0 ,Text1.FontSize);Console.Read();总结n面向对象的概念:抽象,继承,封装,多态n类:声明格式、访问修饰符、常量、字段、构造函数及重载、析构函数n方法n方法的声明:访问修饰符n方法的调用形式:3种(语句、表达式、参数)n方法的参数:4种(值,REF,OUT,PARAMS)n方法的重载与覆盖n属性:GET,SET作业与实验n作业:P301第一、二、三题n实验:类的设计和使用、方法与属性的设计及使用