第3章面向对象编程基础.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章面向对象编程基础3.1面向对象概念3.2类3.3方法3.4属性3.1面向对象概念3.1.1对象、类、实例化类与对象的关系如图3.1所示。3.1.2面向对象程序设计语言的三大原则1.封装所谓“封装”,就是用一个框架把数据和代码组合在一起,形成一个对象。2.继承从这个已有的类可以通过继承的方法派生出新的子类,卡车、轿车、客车等,它们都是汽车类的更具体的类,每个具体的类还可增加自己一些特有的东西。如图3.2所示,更一般地表示如图3.3所示。3.1.2面向对象程序设计语言的三大原则如果一个类有两个或两个以上直接基类,这样的继承结构被称为多重继承或多继承。在现实世界中这种模型屡见不鲜,如:一些组合功能的产品像沙发床,它既有沙发的功能,又有床的功能,沙发床应允许同时继承沙发和床的特征。如图3.4所示,更一般地表示如图3.5所示3.1.2面向对象程序设计语言的三大原则接口可以包含方法、属性、事件和索引器。一个典型的接口就是一个方法声明的列表,接口本身不提供它所定义的成员的实现。所以接口不能被实例化,一个实现接口的类再以适当的方式定义接口中声明的方法。如图3.6所示。3.1.2面向对象程序设计语言的三大原则3.多态性多态性就其字面上的意思是:多种形式或多种形态。在面向对象编程中,多态是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。3.2类3.2.1类的声明要定义一个新的类,首先要声明它。语法形式:[属性集信息]opt[类修饰符]optclass类名[:类基]opt{[类主体]opt}其中:属性集信息:是C#语言提供给程序员为程序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。类修饰符:可以是以下表3.1所列的几种之一或者是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。类基:它定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object。3.2.1类的声明修饰符作用说明public表示不限制对类的访问。类的访问权限省略时默认为publicprotected表示该类只能被这个类的成员或派生类成员访问private表示该类只能被这个类的成员访问internal表示该类能够由程序集中的所有文件使用,而不能由程序集之外的对象使用new只允许用在嵌套类中,它表示所修饰的类会隐藏继承下来的同名成员abstract表示这是一个抽象类,该类含有抽象成员,因此不能被实例化,只能用作基类sealed表示这是一个密封类,不能从这个类再派生出其他类。显然密封类不能同时为抽象类3.2.1类的声明最简单的类声明语法形式:class类名{类成员}例如:classPoint//Point类的访问权限缺省为public{intx,y;}3.2.2类的成员1.常数声明常数声明一般语法形式:[属性集信息]opt[常数修饰符]optconst类型标识符=常数表达式[,标识符=常数表达式]0+其中:常数修饰符可以是:new、public、protected、internal、private。类型必须是:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型相一致,或者可以通过隐式转换转换成目标类型。例如:classA_const{publicconstintX=10;constdoublePI=3.14159;//缺省访问修饰符,即约定为privateconstdoubleY=0.618+3.14;}3.2.2类的成员常数表达式的值应该是一个可以在编译时计算的值,常数声明不允许使用static修饰符,但它和静态成员一样只能通过类访问。例如:classTest{publicstaticvoidMain(){A_constm=newA_const();Console.WriteLine(X={0},PI={1},Y={2},A_const.X,A_const.PIA_const.Y);}}3.2.2类的成员2.字段声明字段声明的一般语法形式:[属性集信息]opt[字段修饰符]opt类型变量声明列表;其中:变量声明列表:标识符或者用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。例如:classA{intx=100,y=200;floatsum=1.0;}字段修饰符为:new、public、protected、internal、private、static、readonly、volatile。其中new、public、protected、internal、private前面已作介绍,加static修饰的字段是静态字段,不加static修饰的字段是实例字段。3.2.2类的成员【例3.1】通过构造函数对只读字段赋值。运行结果如图3.7所示。3.2.3构造函数1.实例构造函数声明实例构造函数的声明语法形式:[属性集信息]opt[构造函数修饰符]opt标识符([参数列表]opt)[:base([参数列表]opt)]opt[:this([参数列表]opt)]opt{构造函数语句块}其中:构造函数修饰符:public、protected、internal、private、extern。标识符([参数列表]opt):标识符是构造函数名,必须与这个类同名,不声明返回类型,并且没有任何返回值。3.2.3构造函数【例3.2】Time类的构造函数及其重载。【例3.3】构造函数初始化。运行结果如图3.8所示。3.2.3构造函数如果类中没有提供这些构造函数,那么CLR会自动提供一个缺省构造函数的。但一旦类中提供了自定义的构造函数,系统则不提供缺省构造函数,这一点需要特别注意,否则系统编译会报出错。如图3.9所示。3.2.3构造函数【例3.4】Point类只定义了一个带两个参数的构造函数,在创建Point对象a时,编译会报告出错信息,如图3.9所示。usingSystem;classPoint{publicdoublex,y;publicPoint(doublex,doubley){this.x=x;//当this在实例构造函数中使用时,this.y=y;//它的值就是对该构造的对象的引用。}}classTest{staticvoidMain(string[]args){Pointa=newPoint();//出错Pointb=newPoint(3,4);//用构造函数初始化对象Console.WriteLine(a.x={0},a.y={1},a.x,a.y);Console.WriteLine(b.x={0},b.y={1},b.x,b.y);}}3.2.3构造函数【例3.5】派生类构造函数及其调用。运行结果如图3.10所示。3.2.3构造函数2.静态构造函数声明静态构造函数的声明语法形式:[属性集信息]opt[静态构造函数修饰符]opt标识符(){静态构造函数体}其中:静态构造函数修饰符:[extern]static或者static[extern]如果有extern修饰,则说明这是一个外部静态构造函数,不提供任何实际的实现,所以静态构造函数体仅仅是一个分号。标识符():标识符是静态构造函数名,必须与这个类同名,静态构造函数不能有参数。静态构造函数体:静态构造函数的目的是用于对静态字段进行初始化,所以它只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。3.2.3构造函数【例3.6】静态构造函数。usingSystem;classScreen{staticintHeight;staticintWidth;intCur_X,Cur_Y;staticScreen(){//静态构造函数,对类的静态字段初始化Height=768;Width=1024;}}3.2.4析构函数声明语法形式:[属性集信息]opt[extern]opt~标识符(){析构函数体}其中:标识符必须与类名相同,但为了区分构造函数,前面需加“~”表明它是析构函数。析构函数不能写返回类型,也不能带参数,因此它不可能被重载,当然它也不能被继承,所以一个类最多只能有一个析构函数。一个类如果没有显式地声明析构函数,则编译器将自动产生一个缺省默认的析构函数。3.2.4析构函数【例3.7】析构函数的调用次序。运行结果如图3.11所示。3.3方法3.3.1方法的声明方法是按照一定格式组织的一段程序代码,在类中用方法声明的方式来定义。方法声明语法形式:[属性集信息]opt[方法修饰符]opt返回类型方法名([形参表]opt){方法体}3.3.1方法的声明其中:方法修饰符有如表3.2所示。修饰符作用说明new在一个继承结构中,用于隐藏基类同名的方法public表示该方法可以在任何地方被访问protected表示该方法可以在它的类体或派生类类体中被访问,但不能在类体外访问private表示该方法只能在这个类体内被访问internal表示该方法可以被同处于一个工程的文件访问static表示该方法属于类型本身,而不属于某特定对象virtual表示该方法可在派生类中重写,来更改该方法的实现abstract表示该方法仅仅定义了方法名及执行方式,但没有给出具体实现,所以包含这种方法的类是抽象类,有待于派生类的实现override表示该方法是将从基类继承的virtual方法的新实现sealed表示这是一个密封方法,它必须同时包含override修饰,以防止它的派生类进一步重写该方法extern表示该方法从外部实现3.3.1方法的声明法修饰符中public、protected、private、internal、protectedinternal属于访问修饰符,用于表示访问的级别,默认情况下,方法的访问级别为public。访问修饰符也可以和其它的方法修饰符有效地组合在一起,但某些修饰符是互相排斥的。表3.3所列的组合被视为非法。修饰符不能与下列选项一起使用staticvirtual、abstract和overridevirtualstatic、abstract和overrideoverridenew、static和virtualabstractvirtual和staticnewoverrideexternabstract3.3.1方法的声明返回类型:方法可以返回值也可以不返回值,如果返回值,则需要说明返回值的类型,它可以是任何一种C#的数据类型,在方法体内是通过return语句将数据交给调用者。如果方法不返回值,则它的返回类型可标为void,当然缺省情况下,默认为void。方法名:每个方法都有一个名称,一般可以按标识符的起名规则随意给定方法名,不过要记住Main()是为开始执行程序的方法预留的,另外不要使用C#的关键字作为方法名。形参表是由零个或多个用逗号分隔的形式参数组成的,形式参数可用属性、参数修饰符、类型等描述。当形参表为空时,外面的圆括号也不能省略。方法体是用花括号括起的一个语句块。3.3.1方法的声明【例3.8】下面程序中的StackTp类定义了几个方法以模拟实现一个压栈操作。运行结果如图3.12所示。3.3.2方法的参数1.值参数【例3.9】下面的程序演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。运行结果如图3.13所示:3.3.2方法的参数【例3.10】下面程序演示的是当方法传递的是一个引用对象(例如数组时)时,对形参的修改会影响到实参。运行结果如图3.14所示。3.3.2方法的参数【例3.11】将【例3.9】程序中Sort方法的值参数传递方式改成引用参数传递,这样在方法Sort中对参数x、y、z按从小到大的排序影响了调用它的实参a、b、c。运行结果如图3.15所示。3.3.2方法的参数3.输出参数【例3.12】在下面程序中,求一个数组元素中的最大值、最小值以及平均值。运行

1 / 41
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功