面向对象程序基础.ppt_第1页
面向对象程序基础.ppt_第2页
面向对象程序基础.ppt_第3页
面向对象程序基础.ppt_第4页
面向对象程序基础.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 面向对象编程基础,教学目标,理解对象与类的相互关系。 掌握继承中父类与子类的关系。 理解并掌握静态成员的应用。 理解并掌握参数的分类与使用。 掌握属性的应用,第3章 面向对象编程基础,例,求学生三门课的成绩与平均分,学生结构,name, score3, ave,类声明的基本内容,class 类名 字段声明 方法声明,对象声明基本内容,类名 对象名; 对象名=new 类名(可选参数,生成对象的两个步骤,通过对象调用类的相应方法实现功能,例2,定义一个圆类,含圆心,半径,周长,面积。 并实现求周长,面积,每个圆及相关功能是一个整体,是对象之上的抽象,它为该类的全部对象提供了统一的抽象描述。

2、所以类是一种抽象的数据类型,是对象的模板。 对象则是类的具体化,是类的实例,对象,是具有属性和操作(方法)的实体。对象的属性表示了它当前的状态;对象的操作则用来改变对象的状态以获得特定的功能。每个对象都有一个惟一的标识名以区别于其他对象,类,面向对象所遵循的三个原则:封装、继承、多态,封装: (encapsulation) 就是用一个框架把数据和代码组合在一起 继承: (inherit,是父类与子类之间共享数据和方法的机制,父类也称基类,子类称为派生类。一个基类可以有任意数目的派生类,如果一个类有两个或两个以上的直接基类,这样的继承结构被称为多重继承或多继承。但C#不支持类多继承。它通过接口来

3、实现多重继承。而接口可以从多个基接口继承,只有到系统运行时,才能根据实际情况决定实现 何种操作的动态绑定方式,多态: (polymorphism,是指同一个操作作用于不同的对象,可以有不同 的解释,实现不同的功能。 多态有两种:静态多态和动态多态,静态多态,指系统在编译过程中根据传递的参数个数,参数 类型及返回值的类型等信息决定实现何种操作的 静态绑定方式,动态多态,类的声明语法形式,属性集信息 类修饰符 class 类名 : 类基 类成员表列 其中: 属性集信息附加的说明信息 类基定义该类的直接基类和由该类实现的接 口,当多于一项时,用逗号分隔,默认 基类是object,类头,类体,类修饰符

4、下表所列的几种之一或是有效组合,说明,派生类的可访问性不得高于基类,类成员组成: 自身声明的类成员。 从基类或接口中继承来的成员。 类成员声明主要包括: 常数声明、字段声明、方法声明、属性声明、事 件声明、索引器声明、运算符声明、构造函数声 明、析构函数声明、静态构造函数、类型声明等 类成员的五种访问修饰符: public 、internal 、 protected、internal protected 、 private(默认,常数声明语法形式,属性集信息 访问修饰符 const 类型 标识符 = 常数表达式 , 其中: 访问修饰符new、public、protected、internal、

5、 private。 类型sbyte、byte、short、ushort、 ulong 、 uint、long、char、 int 、 bool 、枚举 double 、 float 、decimal、string或引 用类型等值类型,常数表达式的值类型应与目标类型一致 或者通过隐式转换规则转换成目标类型,例: class A_const public const int X=10; const double PI=3.14159; const double Y= 0.618+3.14;,常数表达式应是可在编译时计算的,声明时不允许使用static,但它是默认静态的,只能通过类访问,字段声明语法

6、形式: 属性集信息 字段修饰符 类型 变量声明列表; 其中: 变量声明列表标识符或用逗号“,”分隔的多个 标识符,并且变量标识符还可 用赋值号“=”设定初始值 class A int x=100 , y = 200; float sum = 1.0f;,私有字段首单词字母一般小写,对readonly字段,字段修饰符,internal、public、protected 、 new 、static 、private、readonly、volatile,只读字段,只能在声明或是通过类的实例构造函数或静态构造函数赋值,都有默认的对应初值。若给字段初始化,则是在执行期间执行该赋值语句,字段初始值,例1,

7、圆的定义中的PI,可声明为const或readonly成员,例2,一个班级的学生人数应定义为static成员,构造函数,主要实现对对象的初始化。类的成员字段可以分为实例字段和静态字段,与此相应的构造函数也分为实例构造函数和静态构造函数,属性集信息 构造函数修饰符 类名( 参数列表 ) : base ( 参数列表 ) : this ( 参数列表 ) 构造函数语句块,实例构造函数的声明语法形式,this与base继承不能同时出现,构造函数修饰符 类名 ( 参数列表 ) 构造函数语句块,基本构造函数语法,构造函数修饰符,说 明,public、protected、internal、private、ex

8、tern。若是private的,表明类不能被外部类实例化,构造函数无返回类型,它与返回值类型为void的函数不同。构造函数可以没有参数,也可以有一个或多个。这表明构造函数可以重载,创建一个类的对象时,类名后的一对圆括号提供初始化列表,实际上就是提供给构造函数的参数。系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数,若类中提供了自定义的构造函数,系统则不提供默认的构造函数,提示,生成类实例,构造以下三个类,Point类: 提供平面坐标 编写默认构造函数完成赋原点坐标 编写构造函数完成外部传入平面坐标 编写两个方法分别提供点的横、纵坐标值,Circle:Point类 编写默认

9、构造函数完成赋圆心坐标(0,0)和半径1 编写构造函数完成外部传入圆心坐标和半径 编写方法分别提供半径、面积、周长,静态构造函数的声明语法形式: 属性集信息 静态构造函数修饰符 类名( ) 静态构造函数体,说明: 静态构造函数修饰符,extern static 或者static extern 。若有extern修饰符,说明这是一个外部静态构造函数,静态构造函数体仅仅是一个分号,静态构造函数的目的是对静态字段的初始化,所以它只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化,静态构造函数体,静态构造函数是不可继承的,且不能被显示调用 静态构造函数在继承链中最先被调用。 只有创建类的实

10、例或者引用类的任何静态成员 时,才能激活静态构造函数,在给定的应用程 序中静态构造函数至多被执行一次。 如果类中没有声明静态构造函数,而又包含带 有初始设定的静态字段,那么编译器会自动生 成一个默认的静态构造函数,关于静态构造函数,请注意,关于构造函数,还有几点请注意,base ( 参数列表,表示调用直接基类中的实例构造函数,this ( 参数列表,表示调用该类本身所声明的其他构造函数,构造函数语句块,可对静态、非静态字段初始化赋值,但在构造函数体中不要做对类的实例进行初始化以外的事,实例构造函数,不能被继承。如果一个类没有声明任何实例构造函数,则系统会自动提供一个默认的实例构造函数,析构函数

11、,无返回类型,也不能带参数,因此它不可能被重 载,也不能被继承,一个类只有一个析构函数 析构函数不能由程序显式地调用,而是由系统在 释放对象时自动调用。 派生类对象在调用析构函数时也会产生链式反 应,首先执行派生类的析构函数,然后执行基类 的析构函数,如果这个基类还有自己的基类,该 过程就会不断重复,直到调用Object类的析构函 数为止,其执行顺序正好与构造函数相反,析构函数,方法的声明语法,C#实现了完全意义上的面向对象,它没有全局常数、全局变量和全局方法,任何事物都必须封装在类中,属性集信息 方法修饰符 返回类型 方法名 ( 形参表,方法体,方 法,访问修饰符也可以和其他的方法修饰符有效

12、地组合在一起,但某些修饰符是互相排斥的。下表所列的组合被视为非法的无效组合,如果有返回值,则需要说明返回值的类型,它可以是任何一种C#的数据类型,通过return语句返回。若无返回值,则返回类型标为void,定义StackTp类的几个方法以模拟实现一个压栈操作 定义一个Student类,用数组生成含5个Student的实例,返回类型,例,C#参数的4种传递方式,不加修饰的形参是值参数,它表明实参与形参之间按值传递,若值参数是值类型时,传递不影响外部的实参,所以值参数有时也被称为入参数。但若值参数是引用类型时,虽然也是按值传递,但传的是引用,是指向同一空间,所以在方法内改变了形参字段的值,会改变

13、原对象。但应注意交换的区别,即实际的意义,值参数,例1,对三个学生的C#分数按从小到大排序,分别传递三个值参数时,则无法完成实际的排序,例2: 上例中将三个数改用形参数组时,就是引用类 型。 在方法内排序后结果也会改变,数组其实是一种对象,数组名是对象的引用 作为参数传递时,形参也得到了该对象的引用,引用参数,引用参数并不创建新的存储单元,它与方法调用中的实际参数变量同处一个存储单元。因此,在方法内对形参的修改就是对外部实参变量的修改,ref 类型名 形参名,引用形参的语法格式,引用实参语法格式,ref 实参变量名,实参与引用形参的数据类型必须完全匹配,且实参必须是变量,在方法外,ref参数必

14、须在调用前赋值,上例1中改用ref引用参数实现,输出参数,调用语法,在参数前加out修饰符的被称为输出参数,它只能用于从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值,例3,out 实参名 , out 实参名,例: 用out参数传出上例数组中学生的最高分、最低 分、 平均分,ref和out参数也可用于引用类型来传递对象,在学生管理系统中通常要按学生成绩排序,这涉及到学生信息交换问题,定义两个交换串的方法,Swap1,Swap2,它们都有两个string形参,但Swap2的参数加了ref修饰,调用这两个方法产生的结果是不

15、一样的,例,参数数组,C#提供了传递可变长参数表的机制,使用params关键字来修饰一个可变长的一维参数数组,例,下面程序演示了Myclass类中的方法MaxMin有一个参数数组类型的参数,在调用这个方法时具有灵活性,例,求一个int型数组的最大最小值。当数组的元素可变时,如:数组长度为0,3,或直接传元素时,using System; class Myclass public void MaxMin (out int max, out int min, params int a ) / 如果可变参数为零个,可以取一个约定值或产生异常 if (a.Length=0) max=min=1; re

16、turn ; max = min = a0 ; for (int i=1; imax) max=ai; if (aimin) min=ai;,设数组元素不可能出现-1的情况,class Test static void Main() Myclass m = new Myclass ( ); int score = 87,89,56,90,100,75,64,45, 80, 84 ; int smax, smin; m.MaxMin (out smax, out smin); / 可变参数的个数可以零个 Console.WriteLine (Max=0, Min=1 , smax, smin )

17、; / 在4个数之间找最大、最小 m.MaxMin (out smax, out smin, 45, 76, 89, 90 ); Console.WriteLine (Max=0, Min=1 , smax, smin ); m.MaxMin (out smax, out smin, score); / 可变参数也接受数组对象 Console.WriteLine (Max=0, Min=1 , smax, smin ); Console.Read ();,使用参数数组应注意,一个方法中只能声明一个一维params参数,且应 放在参数列表的最后。 由于params参数是一个数组,所以在调用时可为

18、 参数数组指定零个或多个参数,其中每个参数的 类型都应与参数数组的元素类型相同或能隐式 地转换。 无论采用哪种方式调用方法,params参数都是作 为一个数组被处理。可在方法内使用数组的长度 属性来确定在每次调用中所传递参数的个数,不能将params修饰符与ref 或out组合用, params 参数是在方法内部进行数据的复制,所以在方法内 即使对参数数组的元素进行了修改,在方法外的实 参数值也不会发生变化,静态方法用static修饰符修饰,它只处理该类中的静态成员,不可以直接对实例字段赋值,静态方法与实例方法,实例方法可操作静态成员,方法的重载与覆盖,同一个类中不能有相同签名的方法。 但形参

19、个数或形参类型有所不同是允许的,它们 属于不同的方法签名。而仅仅是返回类型不同的 同名方法,编译器是不能识别的,方法的签名,一个方法的名字和形式参数的个数、修饰符及类型共同构成了这个方法的签名,提 示,例: 下面程序定义的Myclass类中含有4个名为max的方法,求班级中两位或是三位同学的最高分,考虑通过,可是int型,也可是double型,调用时,编译器会根据参数的个数和类型确定调用哪个max方法,using System; class Myclass / 该类中有max方法的4个不同版本 / 它们或者参数类型不同,或者参数个数不同 public int max (int x, int y

20、) return x=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, c

21、; 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 ();,编译多态,象上例,编

22、译器根据调用时给出的实参个数及类型调用相应的方法,就是编译多态。 在一个有继承关系的类层次结构中,如果派生类与基类有相同名称或签名的成员,那么在派生类中就隐藏了基类成员,为了警示,编译器会发出一个警告信息。如果派生类是有意隐藏基类成员,可在派生类成员声明中加new修饰符,这样可取消警告信息,使用关键字new在派生类中隐藏相同签名的基类方法,可使当基类对象A被引用到派生类对象B时,它访问的仍是基类的方法,这就是隐藏,隐 藏,重 载,是指在一个类或结构中建立多个同名的方法,但方法的形参互不相同。可是形参个数不同,也可是对就形参数据类型不同,还可是对应形参有无使用关键字out 或ref修饰,只有虚拟

23、方法成员(含属性、索引器、事件)可重写,覆 盖(重写,派生类用关键字override修饰与基类中虚方法有相同签名的方法,表明是对基类的虚方法重写。这就是所谓的“运行时多态”,或者称动态绑定,虚方法,用关键字virtual修饰的方法成员,虚方法重写,当基类方法无virtual关键字,在子类方法中用new 声明一个具有相同签名的方法,实现的是隐藏。 当基类的方法用virtual声明,子类用override覆盖 相同签名虚方法时,实现的是重写,隐藏与重写的区别,在类的层次结构中,只有使用override修饰符,派生类中的方法才可以覆盖(重载)基类的虚方法,否则就是隐藏基类的方法,有关虚方法的使用,请

24、注意,不能将虚方法声明为静态的,因为多态性是 针对对象的,不是针对类的。 不能将虚方法声明为私有的,因为私有方法 不能被派生类覆盖。 覆盖方法必须与它相关的虚方法匹配,也就是 说,它们的方法签名(方法名称、参数个数、 参数类型、返回类型及访问属性等都应该完 全一致。 一个可覆盖方法覆盖的必须是虚方法,属 性,在Windows应用程序设计或是其他语言的控件应用中,我们已经接触过属性。那么,它是如何实现的呢,属性,为了实现良好的数据封装和数据隐藏,类的字段成员的访问属性一般设置成private或protected,这样在类的外部就不能直接读/写这些字段成员了,通常的办法是提供public级的方法来

25、访问私有的或受保护的字段。 C#提供了属性(property)这个更好的方法,把字段域和访问它们的方法相结合。对类的用户而言,属性值的读/写与字段域语法相同;对编译器来说,属性值的读/写是通过类中封装的特别方法get访问器和set访问器实现的,属性修饰符 类型 属性名 访问器声明,get访问器:可读性的处理。 set访问器:写入性的处理,属性声明的一般语法形式,访问器声明:用于声明属性的可读写性操作,属性修饰符 类型 属性名 get / 读访问器 / 访问器语句块 set / 写访问器 / 访问器语句块,属性一般语法形式,对TextBox类的text、fontname、fontsize、 mu

26、ltiline域提供属性方式的读/写访问,using System; class TextBox private string text; private string fontname; private int fontsize; private bool multiline,例,public TextBox ( ) text=text1; fontname=宋体; fontsize=12; multiline=false; public string Text / Text属性,可读可写 get return text; set text=value;,public string Font

27、Name / FontName属性,只读属性 get return fontname; public int FontSize / FontSize属性,可读可写 get return fontsize; set fontsize = value;,public bool MultiLine / MultiLine属性,只写 set multiline = value; class Test static void Main() / 调用Text属性的get访问器 TextBox Text1= new TextBox (); Console.WriteLine (Text1.Text= 0 ,

28、 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 ();,例,有一个课程类,假设只考虑课程号、课程名、学分,用属

29、性实现对字段的访问,若有三门课程,请通过属性访问方法完善上例,通过Course完成,具体数据由键盘输入,扩展: (实验,尽管属性与字段域有相同的使用语法,但它本身并不代表字段域。属性不直接对应存储位置,所以不能把它当变量使用,不能把属性作为ref或者out参数传递。属性并不一定要匹配字段,属性和方法一样,也有静态修饰,在静态属性的访问器中不能访问非静态数据也不能引用this,提 示,get访问器的返回值类型与属性的类型相同,所 以在语句块中的return语句必须有一个可隐式转 换为属性类型的表达式。 set访问器无返回值,但它有一个隐式值参数 value,它的类型与属性的类型相同。 同时包含get和set访问器的属性是读/写属性, 只包含get访问器的属性是只读属性,只包含set 访问器的属性是只写属性。 属性必须有返回值,不能是void的,总 结,从商业角度看,例:库存商品数量,有客户订 单时,作为商业机密,你提供的订货接口,隐 藏了库存信息,综合应用实例,班级学生成绩管理。根据学生必修的课程及课程学分和课程成绩计算GPA,最后按GPA的值对学生进行排序,GPA(g

温馨提示

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

评论

0/150

提交评论