面向对象编程基础

上传人:辰*** 文档编号:121933080 上传时间:2022-07-19 格式:PPTX 页数:75 大小:461.61KB
收藏 版权申诉 举报 下载
面向对象编程基础_第1页
第1页 / 共75页
面向对象编程基础_第2页
第2页 / 共75页
面向对象编程基础_第3页
第3页 / 共75页
资源描述:

《面向对象编程基础》由会员分享,可在线阅读,更多相关《面向对象编程基础(75页珍藏版)》请在装配图网上搜索。

1、会计学1面向对象编程基础面向对象编程基础2 姓名、性别、年龄等:属性学习课程、参加社会活动:方法3.1 面向对象编程概念 1.对象具有属性和操作(方法)的实体。属性:对象所处的状态 方法:用于改变对象状态以达到特定的功能 对象有一个唯一的标识名 2.类在对象之上的抽象,一种抽象的数据类型 3.类是对象的模板,对象是类的具体化或类的实例示例:学生类各位同学对象第1页/共75页3属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬 吠 第2页/共75页4用一个框架把数据和代码组合在一起,形成一个对象。类是支持对象封装的工具,对象则是封装的基本单元。

2、利用继承可以创建分等级层次的类,继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。单继承:一个基类可以有任意数目的派生类,即 一父多子多继承:一个类若有两个或两个以上的直接基类,即一子多父,称为多重继承,C#通过接口来实现同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。分为静态多态和动态多态根据参数的差别 直接调用对象方法根据基类 间接调用对象方法第3页/共75页53.2.1 类的声明语法形式:属性集信息 类修饰符 class 类名:类基 类主体 1.属性集信息是C#语言为程序中定义的各种实体附加一些说明信息,是C#语言的一个重要特征。属于高级编程

3、内容,一般涉及不到。2.类名:唯一标识名3.类基:直接基类或接口。默认基类是object类,多个接口之间用逗号相隔4.类修饰符访问权限、类的类型等,注意同一修饰符不允许出现多次,见表3.1第4页/共75页6修饰符作 用 说 明public表示不限制对类的访问。类的访问权限省略时默认为 publicprotected表示该类只能被这个类的成员或派生类成员访问private表示该类只能被这个类的成员访问,很少用internal表示该类能够由程序集中的所有文件使用,而不能由程序集之外的对象使用new只允许用在嵌套类中,它表示所修饰的类会隐藏继承下来的同名成员abstract表示这是一个抽象类,该类含

4、有抽象成员,因此不能被实例化,只能用作基类sealed表示这是一个密封类,不能从这个类再派生出其他类。显然密封类不能同时为抽象类示例:class Student /类主体第5页/共75页7类体(类主体)用于定义该类的成员 用一对花括号 括起来,由两部分组成:1.类体中以类成员声明形式引入的类成员包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等 2.直接从基类继承而来的成员第6页/共75页8一、成员类型:(1)静态成员 在字段、方法、属性、事件、运算符和构造函数声明中含有public static修饰符(2)实例

5、成员 在字段、方法、属性、事件、运算符和构造函数声明中不含有public static修饰符二、默认成员访问修饰符private 类成员注意点:第7页/共75页9class Program class AClass public static int x=1;public int y=2;static void Main(string args)AClass ab=new AClass();Console.WriteLine(y=0,x=1,ab.y,AClass.x);第8页/共75页10语法形式:属性集信息 常数修饰符 const 类型 标识符=常数表达式,常数修饰符 new、public

6、、protected、private、internal public:访问不受限制 protected:访问仅限于包含类或从包含类派生的类型 internal:访问仅限于当前程序集。private:访问仅限于包含类。类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型一致,或者通过隐式转换规则转换成目标类型。第9页/共75页11例如:class A_const public const int X=10;const double

7、PI=3.14159;/默认访问修饰符private const double Y=0.618+3.14;注意1.常数表达式的值是一个可以在编译时计算的值注意2.常数声明不允许使用static修饰符,只能通过类访问。class Test public static void Main()A_const m=new A_const();Console.WriteLine(“X=0,PI=1,Y=2”,A_const.X,A_const.PI,A_const.Y);第10页/共75页12语法形式:属性集信息 字段修饰符 类型 变量声明列表;1.变量声明列表标识符或用逗号“,”分隔的多个标识符,并且

8、变量标识符还可用赋值号“=”设定初始值。2.字段修饰符new、public、protected、private、internal、static、readonly、volatilestatic:静态变量。利用类直接访问静态变量,利用类的实例(对象)访问非静态变量readonly:只读变量,声明时或在构造函数中赋值,一旦赋值不可改变。与const常量不同,const常量编译时赋值计算。volatile:表示字段可能被多个并发执行的进程修改。第11页/共75页13【例3.1】通过构造函数给只读字段赋值using System;public class Area public readonly dou

9、ble Radius;/Radius是只读字段 private double x,y;public double Size;public static double Sum=0.0;public Area()Radius=1.0;/通过构造函数对radius赋值 class Test public static void Main()Area s1=new Area();/s1.Radius=2;Console.WriteLine(Radius=0,Size=1,Sum=2,s1.Radius,s1.Size,Area.Sum);/静态字段通过类访问Area.Sum,实例字段通过对象访问s1.

10、Size Console.Read();出错了!无法修改只读字段第12页/共75页141构造函数(1)实现对象初始化(2)分为实例构造函数和静态构造函数(3)函数调用时机:new1)实例构造函数的声明语法形式:属性集信息 构造函数修饰符 标识符(参数列表):base(参数列表):this(参数列表)构造函数语句块 public与类名相同没有返回值构造函数重载:参数个数或类型不同调用基类同参数列表的构造函数调用本类同参数列表的构造函数第13页/共75页151.构造函数修饰符public、protected、internal、private、extern一般地,构造函数总是public类型的。如果

11、是private类型的,表明类不能被外部类实例化。2.标识符(参数列表 opt)构造函数名必须与这个类同名,无返回类型和返回值 构造函数可以有0n个参数构造函数重载 3.用new运算符创建一个类的对象时,类名后的一对圆括号提供初始化列表,系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数。实例构造函数注意点:第14页/共75页16class 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

12、 Time(8,30,30);【例3.2】Time类的构造函数及其重载using System;public class Time private int hour,minute,second;public Time()hour=minute=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;public string getTime()r

13、eturn hour.ToString()+:+minute.ToString()+:+second.ToString();Console.WriteLine(t1=0,t1.getTime();第15页/共75页17using System;class Point public double x,y;public Point()x=0;y=0;public Point(double x,double y)this.x=x;/当this在实例构造函数中使用时,this.y=y;/它的值就是对该构造的对象的引用class Test public static void Main()Point a

14、=new Point();Point b=new Point(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);Console.Read();a.x=0,a.y=0b.x=3,b.y=4第16页/共75页181.若类中没有提供构造函数,则CLR会自动提供一个默认的构造函数2.一旦类中提供了自定义的构造函数,系统则不提供默认的构造函数3.不必显示调用构造函数4.实例构造函数不能被继承第17页/共75页19派生类构造函数的调用1.调用时机:创建派生类的对象时,

15、即 new2.构造函数不被继承3.派生类构造函数在执行前,首先显式或隐式地调用基类构造函数4.默认调用基类的无参数构造函数除非显式地指定调用有参数构造函数5.this关键字引用类的当前实例6.base关键字用于从派生类中访问基类的成员1.调用基类上已被其他方法重写的方法2.指定创建派生类实例时应调用的基类构造函数第18页/共75页20【例3.4】派生类构造函数及其调用using System;class Point private int x,y;public Point()x=0;y=0;Console.WriteLine(Point()constructor:0,this);public

16、Point(int x,int y)this.x=x;this.y=y;Console.WriteLine(Point(x,y)constructor:0,this);class Circle:Point private double radius;public Circle()/默认约定调用基类的无参构造函数Point()Console.WriteLine(Circle()constructor:0,this);public Circle(double radius):base()this.radius=radius;Console.WriteLine(Circle(radius)const

17、ructor:0,this);public Circle(int x,int y,double radius):base(x,y)this.radius=radius;Console.WriteLine(Circle(x,y,radius)constructor:0,this);class Test static void Main()Point a=new Point();Circle b=new Circle(3.5);Circle c=new Circle(1,1,4.8);Console.Read();13254第19页/共75页212)静态构造函数的声明语法形式:属性集信息 静态构造

18、函数修饰符 标识符()静态构造函数体 静态构造函数修饰符 extern static 或者static extern。如有extern修饰,则是一个外部静态构造函数,不提供任何实际的实现,静态构造函数体仅仅是一个分号 标识符 是静态构造函数名,必须与类同名且不能有参数 静态构造函数体只能对静态数据成员进行初始化第20页/共75页221.静态构造函数不可继承,不能直接调用2.调用时机:1)创建类的实例2)引用类的任何静态成员3.至多被执行一次4.若类没有声明静态构造函数,而又包含带有初始设定的静态字段时,编译器会自动生成一个默认的静态构造函数静态构造函数注意点:第21页/共75页23语法形式:属

19、性集信息 extern 标识符()析构函数体 标识符必须与类名相同,前面需加“”析构函数不能写返回类型,也不能带参数,一个类最多只能有一个析构函数第22页/共75页241.析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用2.派生类对象的析构函数调用链:1)执行派生类的析构函数2)执行基类的析构函数,直到调用object类的析构函数为止与执行构造函数的顺序相反第23页/共75页251.理解基本概念2.理解类3.使用构造函数4.学习方法5.学习属性掌握第24页/共75页26第25页/共75页27第26页/共75页28第27页/共75页29n调用顺序调用顺序n先基类后派生类先基类后派生类

20、第28页/共75页303.3.1 方法的声明语法形式:属性集信息 方法修饰符 返回类型 方法名(形参表)方法体1.C#中所有的变量、方法都必须封装在类中2.对象间、类间只能通过类所提供的方法进行互操作3.从方法的声明、方法的参数、静态方法与实例方法、方法的重载与覆盖等方面理解第29页/共75页31表3.2 方法修饰符修修 饰饰 符符作作 用用 说说 明明new在一个继承结构中,用于隐藏基类同名的方法在一个继承结构中,用于隐藏基类同名的方法public表示该方法可以在任何地方被访问,表示该方法可以在任何地方被访问,默认默认publicprotected表示该方法可以在它的类体或派生类类体中被访问

21、,但不能在类表示该方法可以在它的类体或派生类类体中被访问,但不能在类体外访问体外访问private表示该方法只能在这个类体内被访问表示该方法只能在这个类体内被访问internal表示该方法可以被同处于一个工程的文件(程序集)访问表示该方法可以被同处于一个工程的文件(程序集)访问static表示该方法属于类本身,而不属于某特定对象表示该方法属于类本身,而不属于某特定对象virtual表示该方法可在派生类中重写,来更改该方法的实现表示该方法可在派生类中重写,来更改该方法的实现abstract表示该方法仅仅定义了方法名及执行方式,但没有给出具体实现,表示该方法仅仅定义了方法名及执行方式,但没有给出具

22、体实现,所以包含这种方法的类是抽象类,有待于派生类的实现所以包含这种方法的类是抽象类,有待于派生类的实现override表示该方法是将从基类继承的表示该方法是将从基类继承的virtual方法的新实现方法的新实现sealed表示这是一个密封方法,它必须同时包含表示这是一个密封方法,它必须同时包含override修饰,以防止修饰,以防止它的派生类进一步重写该方法它的派生类进一步重写该方法extern表示该方法从外部实现表示该方法从外部实现第30页/共75页32修修 饰饰 符符不能与下列选项一起使用不能与下列选项一起使用staticvirtual、abstract 和和 overridevirtua

23、lstatic、abstract 和和 overrideoverridenew、static 和和 virtualabstractvirtual 和和 staticnewoverrideexternabstract返回类型方法可以返回值也可以不返回值。返回值类型为任意一种C#的数据类型,通过return语句返回。如果方法不返回值,则它的返回类型可标为void,默认情况下为 void方法名:除 Main()、关键字以外第31页/共75页33【例3.6】下面程序中的StackTp类定义了几个方法以模拟实现一个压栈操作。using System;class StackTp int MaxSize;i

24、nt Top;int StkList;public StackTp()/构造函数 MaxSize=100;Top=0;StkList=new int MaxSize;public StackTp(int size)/构造函数 MaxSize=size;Top=0;StkList=new int MaxSize;public bool isEmptyStack()/方法 if (Top=0)return true;else return false;public bool isFullStack()if(Top=MaxSize)return true;else return false;publ

25、ic void push(int x)StkListTop=x;Top+;class Test public static void Main()StackTp ST=new StackTp(20);string s1;if(ST.isEmptyStack()/调用方法 s1=Empty;else s1=not Empty;Console.WriteLine(Stack is +s1);for(int i=0;iy)tmp=x;x=y;y=tmp;if(xz)tmp=x;x=z;z=tmp;if(yz)tmp=y;y=z;z=tmp;/Console.WriteLine(“x=0,y=1,z=

26、2 x,y,z);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);Console.Read();【例3.7】演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。第34页/共75页36是值参数传递方式,形参另外分配一块内存,接受实参的引用值副本1.对引用值的修改不会影响实参2.如果改变的是所引用的对象,则将会影响实参所引用的对象值参数传递引用对象内存首地址第35页/共75页37

27、using System;class Myclass public void SortArray(int a)int i,j,pos,tmp;for(i=0;ia.Length1;i+)for(pos=j=i;ja j)pos=j;if(pos!=i)tmp=ai;ai=apos;apos=tmp;class Test static void Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;m.SortArray(score);for(int i=0;iy)tmp=x;x=y;y=tmp;if(xz)

28、tmp=x;x=z;z=tmp;if(yz)tmp=y;y=z;z=tmp;/Console.WriteLine(“x=0,y=1,z=2 x,y,z);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);Console.Read();【例3.7】演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。第38页/共75页402.引用参数引用参数形参的改变实参1.例3.7中 实际变量a

29、、b、c是不随形参x、y、z的,但如果想改变实际变量a、b、c的值,则用引用参数2.C#用ref修饰符 声明 引用参数3.引用参数不创建新的存储单元,与方法调用中的实际参数变量同处一个存储单元传递内存地址4.属于输入参数第39页/共75页41【例3.9】将例3.7程序中Sort方法的值参数传递方式改成引用参数传递,这样在方法Sort中对参数x、y、z按从小到大的排序影响了调用它的实参a、b、c。using System;class Myclass public void Sort(ref int x,ref int y,ref int z)int tmp;/tmp是方法Sort的局部变量 /将

30、x,y,z按从小到大排序 if(xy)tmp=x;x=y;y=tmp;if(xz)tmp=x;x=z;z=tmp;if(yz)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(ref a,ref b,ref c);Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();第40页/共75页42使用ref声明引用参数的注意:(1)方法的参数声明中ref关键字仅对紧跟在它后面的参数有效,而不能应用于整个

31、参数表。例如,Sort方法中x、y、z都要加ref修饰(2)在方法的调用中也要用ref修饰实参,且实参必须为变量,实参和形参的数据类型必须完全匹配(3)在方法外(方法调用前),ref参数必须明确赋值(4)ref参数也可以用于传递引用类型的对象第41页/共75页43l方法第42页/共75页44第43页/共75页453.输出参数1.用法与ref参数相似,但为输出参数值2.只能用于从方法中传出值,因此必须在方法结束之前对out参数赋值3.在参数前加out修饰符的形式参数4.out参数也可以用于传递引用类型的对象第44页/共75页46class Test static void Main()Mycla

32、ss m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;int smax,smin;double savg;m.MaxMinArray(score,out smax,out smin,out savg);Console.Write(Max=0,Min=1,Avg=2 ,smax,smin,savg);Console.Read();【例3.10】求一个数组中元素的最大值、最小值和平均值。using System;class Myclass public void MaxMinArray(int a,out int max,out i

33、nt min,out double avg)int sum;sum=max=min=a0;for(int i=1;imax)max=ai;if(aimin)min=ai;sum+=ai;avg=sum/a.Length;第45页/共75页47【例3.11】下面程序定义了两个方法,一个是Swap1,一个是Swap2,它们都有两个引用对象作为参数,但Swap2的参数加了ref修饰,调用这两个方法产生的结果是不一样的。using System;class Myclass public void Swap1(string s,string t)string tmp;tmp=s;s=t;t=tmp;pu

34、blic void Swap2(ref string s,ref string t)string tmp;tmp=s;s=t;t=tmp;class Test static void Main()Myclass m=new Myclass();string s1=ABCDEFG,string s2=134567;m.Swap1(s1,s2);Console.WriteLine(s1=0,s1);Console.WriteLine(s2=0,s2);m.Swap2(ref s1,ref s2);Console.WriteLine(s1=0,s1);Console.WriteLine(s2=0,s

35、2);Console.Read();s1,s2的引用并没有改变s1,s2的引用互相交换了第46页/共75页484参数数组3.3.3 静态方法与实例方法特点:参数为可变长度 使用params关键字来指定一个可变长度的参数表注意:1.一个方法中只能声明一个params参数2.params参数必须放在参数表最后3.params参数是一个一维数组,参数数组的参数:0n4.params不可与ref、out修饰符组合使用1.静态方法用static修饰2.只能访问类中的静态成员第47页/共75页49【例3.12】下面程序演示了Myclass类中的方法MaxMin有一个参数数组类型的参数,在调用这个方法时具有

36、灵活性。using System;class Myclass public void MaxMin(out int max,out int min,params int a)/如果可变参数为零个,/取一个约定值或产生异常 if(a.Length=0)max=min=1;return;max=min=a0;for(int i=1;imax)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);publ

37、ic 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;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

38、,f,m.max(e,f);Console.WriteLine(max(0,1,2)=3 ,e,f,g,m.max(e,f,g);Console.Read();第50页/共75页52方法的覆盖使用new隐藏有相同签名的方法1.当派生类与基类有相同名称或签名的成员时,在派生类中默认隐藏基类成员,但提示警告2.在派生类成员声明中加new修饰符,可以取消警告信息3.基类对象被引用到派生类对象时,访问的仍是基类的方法静态多态第51页/共75页53【例3.15】定义了一个基类Shape,含有字段域width和height,分别表示形状的宽和高,并定义了一个area方法,求形状的面积。它的派生类Trian

39、gle和Trapezia都用关键字new修饰了area方法using System;class Shape protected double width;protected double height;public Shape()width=height=0;public Shape(double x)width=height=x;public Shape(double w,double h)width=w;height=h;public double area()return width*height;class Triangle:Shape/三角形 public Triangle(doub

40、le x,double y):base(x,y)new public double area()/派生类方法与基类方法同名,编译时会有警告信息 return width*height/2;class Trapezia:Shape /梯形 double width2;public Trapezia(double w1,double w2,double h):base(w1,h)width2=w2;new public double area()/加new隐藏基类的area方法 return (width+width2)*height/2;class Test static void Main()

41、Shape A=new Shape(2,4);Triangle B=new Triangle(1,2);Trapezia C=new Trapezia(2,3,4);Console.WriteLine(A.area=0,A.area();/调Shape的area方法 Console.WriteLine(B.area=0,B.area();/调Triangle的area方法 Console.WriteLine(C.area=0,C.area();/调Trapezia的area方法 A=B;/在C#中,基类的引用也能够引用派生类对象 Console.WriteLine(A.area=0,A.are

42、a();/调Shape的area方法 A=C;Console.WriteLine(A.area=0,A.area();/调Shape的area方法 Console.Read();基类方法第52页/共75页541.虚方法:基类的方法用关键字virtual修饰2.对基类的虚方法重载:派生类用关键字override修饰与基类中虚方法有相同签名的方法注意:(1)不能将虚方法声明为静态的(static)(2)不能将虚方法声明为私有的(private)(3)覆盖方法必须与它相关的虚方法匹配(4)一个覆盖方法覆盖的必须是虚方法实现运行时多态(动态绑定)第53页/共75页55【例3.16】将例3.15改写,S

43、hape类中的方法area用virtual修饰,而派生类Triangle和Trapezia用override修饰area方法。using System;class Shape protected double width;protected double height;public Shape()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修饰符声明一个虚方法

44、return width*height;class Triangle:Shape /三角形 public Triangle(double x,double y):base(x,y)public override double area()/派生类中用override修饰符覆盖基类虚方法 return width*height/2;class Trapezia:Shape /梯形 double width2;public Trapezia(double w1,double w2,double h):base(w1,h)width2=w2;public override double area()

45、派生类中用override修饰符覆盖基类虚方法 return (width+width2)*height/2;class Test static void Main()Shape A=new Shape(2,4);Triangle B=new Triangle(1,2);Trapezia C=new Trapezia(2,3,4);Console.WriteLine(A.area=0,A.area();/调Shape的area方法 Console.WriteLine(B.area=0,B.area();/调Triangle的area方法 Console.WriteLine(C.area=0,C

46、.area();/调Trapezia的area方法 A=B;Console.WriteLine(A.area=0,A.area();/调派生类Triangle的area方法 A=C;Console.WriteLine(A.area=0,A.area();/调派生类 Trapezia的area方法 Console.Read();派生类方法第54页/共75页561.回顾一下 例3.2(P51)。为了实现良好的数据封装和数据隐藏,类的字段成员的访问属性一般设置成private(默认)或protected 利用public 方法来访问私有的或受保护的字段第55页/共75页57 public strin

47、g getTime()return hour.ToString()+:+minute.ToString()+:+second.ToString();【例3.2】Time类的构造函数及其重载using System;public class Time private int hour,minute,second;public Time()hour=minute=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,in

48、t m,int s)hour=h;minute=m;second=s;class Test static void Main()Time t1,t2,t3,t4;t1=new Time();t2=new Time(8);t3=new Time(8,30);t4=new Time(8,30,30);t1.getTime();t2.getTime();t3.getTime();t4.getTime();第56页/共75页58 1.保持原有的数据封装和数据隐藏,类的字段成员的访问属性仍然设置成private(默认)或protected?2.不利用public方法来访问私有的或受保护的字段 属性(pr

49、operty)属性值的读/写与字段域语法相同;利用get和set访问器实现属性值的读/写如何做?第57页/共75页59语法形式:属性集信息 属性修饰符 类型 成员名 访问器声明 属性修饰符与方法修饰符(public,private,protected,)相同,包括new、static、virtual、abstract、override和4种访问修饰符的合法组合,遵循相同的规则。访问器声明声明属性的访问器,get访问器或set访问器,或者两个语法形式:get /读访问器 /访问器语句块 set /写访问器 /访问器语句块 属性的声明方法第58页/共75页601.get访问器1.返回值类型与属性的

50、类型相同2.在语句块中的return语句必须有一个可隐式转换为属性类型的表达式2.set访问器1.没有返回值2.有一个隐式的值参数value,类型与属性的类型相同。3.属性的种类1.读/写属性:同时包含get和set访问器的属性2.只读/只写属性:只包含get或set访问器的属性属性中的访问器使用注意第59页/共75页61【例3.17】对TextBox类的text、fontname、fontsize、multiline域提供属性方式的读/写访问。using System;class TextBox private string text;private string fontname;priv

51、ate 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 FontName /FontName属性,只读属性 get return fontname;public int FontSize /FontSize属性,可读可写 get return fontsize;set fontsize=

52、value;public bool MultiLine /MultiLine属性,只写 set multiline=value;class Test static 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 ,Text

53、1.FontName);Text1.FontSize=36;Text1.MultiLine=true;Console.WriteLine(Text1.FontSize=0 ,Text1.FontSize);Console.Read();第60页/共75页62【例3.18】定义Label类,设置Width和Heigh属性,分别存放两点之间在水平坐标轴和垂直坐标轴上的投影长度。using System;class Point int x,y;public int X get return x;public int Y get return y;public Point()x=y=0;public

54、Point(int x,int y)this.x=x;this.y=y;class Label Point p1=new Point();Point p2=new Point(5,10);public int Width /计算两点之间在水平坐标轴上的投影长度 get return p2.Xp1.X;public int Height /计算两点之间在垂直坐标轴上的投影长度 get return p2.Yp1.Y;class Test static void Main()Label Label1=new Label();Console.WriteLine(Label1.Width=0 ,Lab

55、el1.Width);Console.WriteLine(Label1.Height=0 ,Label1.Height);Console.Read();第61页/共75页63【例3.19】学生成绩管理程序。根据学生选修的课程及课程学分和课程成绩计算GPA,最后按GPA的值对学生进行排序。基本思路:本程序的学生总人数、课程名、课程学分可以由控制台输入,为叙述简单,假定每个学生所选修的课程相同。Course类中定义了课程名、课程学分字段域,Name属性、构造函数。Student类中定义 字段:学生姓名、学号、选修课程数、Course类对象数组、成绩和GPA等 属性:CourseNum静态属性、GP

56、A属性、Name属性 方法:SetCourse方法设置课程名,静态方法AddData方法给每个学生加入姓名、学号、成绩。ComputeGPA 方法计算学生成绩的GPAstuSwap方法对两个Student对象内容进行交换。第62页/共75页64class Coursestring courseName;/课程名 int courseMark;/课程学分public Course()public Course(string Name,int Mark)courseName=Name;courseMark=Mark;public string Name /Name属性,课程名可读可写get ret

57、urn courseName;set courseName=value;public int Mark /Mark属性,课程学分可读可写get return courseMark;set courseMark=value;第63页/共75页65class Studentstring stuName;/学生姓名string stuID;/学生学号static int numberOfCourse;static Course list;int stuScore;/每个学生对象的各课程成绩double stuGPA;/GPA值public Student()list=new Coursenumber

58、OfCourse;for(int i=0;inumberOfCourse;i+)listi=new Course();stuScore=new intnumberOfCourse;加static修饰符表明这个域为所有学生类对象共享Course类对象数组,用于设置每门课程名、课程学分第64页/共75页66/将CourseNum定义成静态属性是因为它只对静态域进行操作public static int CourseNum get return numberOfCourse;set numberOfCourse=value;public double GPA /GPA属性是只读属性getreturn

59、 stuGPA;public string Name /Name属性可读可写get return stuName;setstuName=value;第65页/共75页67/将SetCourse设为静态方法,是因为它仅访问静态数据域/不需要创建Student类对象就可直接用Student类名调用/它的形参是一个参数数组,这样调用时就可根据实际选修的课程数来设置public static void SetCourse(params Course topic)for(int i=0;itopic.Length;i+)listi.Name=topici.Name;listi.Mark=topici.M

60、ark;/AddData方法将一个学生的数据添加到学生类对象数组中public void AddData(string name,string Id,int score)stuName=name;stuID=Id;for(int i=0;iscore.Length;i+)stuScorei=scorei;第66页/共75页68/根据课程的学分以及学生成绩计算GPApublic void ComputeGPA()int i;double sMark,sumMark=0,sumGP=0;for(i=0;i=95)sMark=4.5;else if(stuScorei=90)sMark=4;else

61、 if(stuScorei=85)sMark=3.5;else if(stuScorei=80)sMark=3;else if(stuScorei=75)sMark=2.5;else if(stuScorei=70)sMark=2;else if(stuScorei=65)sMark=1.5;else if(stuScorei=60)sMark=1;else sMark=0;sumGP+=listi.Mark*sMark;sumMark+=listi.Mark;stuGPA=sumGP/sumMark;第67页/共75页69/stuSwap方法提供两个Student类对象的交换操作,注意形参被

62、修饰为refpublic void stuSwap(ref Student stu1,ref Student stu2)string name,Id;int i;int score=new int Student.CourseNum;double gpa;name=stu1.Name;Id=stu1.stuID;gpa=stu1.GPA;for(i=0;iStudent.CourseNum;i+)scorei=stu1.stuScorei;stu1.stuName=stu2.stuName;stu1.stuID=stu2.stuID;stu1.stuGPA=stu2.stuGPA;for(i=

63、0;iStudent.CourseNum;i+)stu1.stuScorei=stu2.stuScorei;stu2.stuName=name;stu2.stuID=Id;stu2.stuGPA=gpa;for(i=0;iStudent.CourseNum;i+)stu2.stuScorei=scorei;静态属性第68页/共75页70Test类中的MaxMinGPA方法求最大和最小GPA值,SortGPA方法按学生的GPA值对Student类对象数组进行排序。Test类代码如下:class Test public static void Main()Test T=new Test();int

64、 i,j,Num,Mark;string sline,Name,Id;double sMax,sMin;Console.Write(请输入学生总人数);sline=Console.ReadLine();/从控制台接受学生总人数Num=int.Parse(sline);/将string类型转换成int类型Console.Write(请输入选修课程总数);sline=Console.ReadLine();Student.CourseNum=int.Parse(sline);/CourseNum是Student的静态属性 Student Stu=new Student Num;/根据输入的学生总人数

65、,动态地创建对象第69页/共75页71/对Student类的对象数组进行初始化for(i=0;iNum;i+)Stui=new Student();Course tp=new CourseStudent.CourseNum;/根据课程数创建Course类对象数组int score=new int Student.CourseNum;/具体输入每门课名称、学分for(i=0;iStudent.CourseNum;i+)Console.Write(请输入选修课程名);Name=Console.ReadLine();Console.Write(请输入选修课程学分);sline=Console.Rea

66、dLine();Mark=int.Parse(sline);tpi=new Course(Name,Mark);/根据课程名、学分对Course数组进行初始化Student.SetCourse(tp);/用类名调用Student的静态方法SetCouse第70页/共75页72/输入学生姓名、学号、各门课成绩for(i=0;iNum;i+)Console.Write(请输入学生姓名);Name=Console.ReadLine();Console.Write(请输入学号);Id=Console.ReadLine();for(j=0;jStudent.CourseNum;j+)Console.Write(请输入0课程的成绩,tpj.Name);sline=Console.ReadLine();scorej=int.Parse(sline);Stui.AddData(Name,Id,score);/将当前输入的一个学生数据加到对象数组中Stui.ComputeGPA();/计算当前这个学生的GPAConsole.WriteLine(你的GPA值是:0:F2,Stui.GPA);T.MaxMi

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!