面向对象编程基础_第1页
面向对象编程基础_第2页
面向对象编程基础_第3页
面向对象编程基础_第4页
面向对象编程基础_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第3章 面向对象编程基础,1. 理解基本概念 2. 理解类 3. 使用构造函数 4. 学习方法 5. 学习属性,掌握,2,姓名、性别、年龄等:属性 学习课程、参加社会活动:方法,3.1 面向对象编程概念,1. 对象具有属性和操作(方法)的实体。 属性:对象所处的状态 方法:用于改变对象状态以达到特定的功能 对象有一个唯一的标识名 2. 类在对象之上的抽象,一种抽象的数据类型 3. 类是对象的模板,对象是类的具体化或类的实例 示例: 学生类 各位同学对象,3,对象 与 类,属性,型号,价格,里程,行为,起动,停车,行驶,属性,车轮数量,档的数量,行为,加速,换档,刹车,属性,名称,颜色,品种

2、,行为,摇尾巴,吃东西,犬 吠,4,面向对象程序设计在处理对象时,必须遵循的三个原则:,1封装 用一个框架把数据和代码组合在一起,形成一个对象。 类是支持对象封装的工具,对象则是封装的基本单元。 2继承 利用继承可以创建分等级层次的类,继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。 单继承:一个基类可以有任意数目的派生类,即 一父多子多继承:一个类若有两个或两个以上的直接基类,即一子多父,称为多重继承,C#通过接口来实现 3多态性 同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。分为静态多态和动态多态,根据参数的差别 直接调用对象方法,根据基类

3、 间接调用对象方法,5,3.2 类,属性集信息是C#语言为程序中定义的各种实体附加一些说明信息,是C#语言的一个重要特征。属于高级编程内容,一般涉及不到。 类名:唯一标识名 类基:直接基类或接口。默认基类是object类,多个接口之间用逗号相隔 类修饰符访问权限、类的类型等,注意同一修饰符不允许出现多次,见表3.1,6,表3.1 类修饰符,示例: class Student / 类主体 ,7,3.2.2 类的成员,类体(类主体)用于定义该类的成员 用一对花括号 括起来,由两部分组成: 1. 类体中以类成员声明形式引入的类成员 包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、

4、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等 2. 直接从基类继承而来的成员,8,一、成员类型: (1)静态成员 在字段、方法、属性、事件、运算符和构造函数 声明中含有public static修饰符 (2)实例成员 在字段、方法、属性、事件、运算符和构造函数 声明中不含有public static修饰符 二、默认成员访问修饰符private,类成员注意点:,9,class Program class AClass public static int x=1; public int y=2; static void Main(string args) AClass ab =

5、 new AClass(); Console.WriteLine(y=0,x=1,ab.y,AClass.x); ,10,1常数声明,常数修饰符 new、public、protected、 private 、 internal public:访问不受限制 protected:访问仅限于包含类或从包含类派生的类型 internal:访问仅限于当前程序集。 private:访问仅限于包含类。 类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应

6、与目标类型一致,或者通过隐式转换规则转换成目标类型。,11,例如: class A_const public const int X=10; const double 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

7、”, A_const.X , A_const.PI, A_const.Y); ,12,2字段声明,语法形式: 属性集信息 字段修饰符 类型 变量声明列表; 变量声明列表标识符或用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。 字段修饰符new、public、protected、private、 internal、 static、readonly、volatile static: 静态变量。利用类直接访问静态变量, 利用类的实例(对象)访问非静态变量 readonly:只读变量,声明时或在构造函数中赋值,一旦赋值不可改变。与const常量不同,const常量编译时赋值计

8、算。 volatile:表示字段可能被多个并发执行的进程修改。,13,【例3.1】 通过构造函数给只读字段赋值,using System; public class Area public readonly double 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 =

9、 new Area( ); /s1.Radius = 2; Console.WriteLine (Radius=0, Size=1,Sum=2,s1.Radius,s1.Size , Area.Sum); / 静态字段通过类访问Area.Sum,实例字段通过对象访问s1.Size Console.Read (); ,出错了! 无法修改只读字段,14,3.2.3 构造函数和析构函数,1)实例构造函数的声明 语法形式: 属性集信息 构造函数修饰符 标识符 ( 参数列表 ) : base ( 参数列表 ) : this ( 参数列表 ) 构造函数语句块 ,public,与类名相同 没有返回值,构造函

10、数重载: 参数个数或类型不同,调用基类同参数列表的构造函数,调用本类同参数列表的构造函数,15,构造函数修饰符 public、protected、internal、private、extern 一般地,构造函数总是public类型的。 如果是private类型的,表明类不能被外部类实例化。 标识符(参数列表 opt)构造函数名 必须与这个类同名,无返回类型和返回值 构造函数可以有0n个参数构造函数重载 3. 用new运算符创建一个类的对象时,类名后的一对圆括号提供初始化列表,系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数。,实例构造函数注意点:,16,【例3.2】 Ti

11、me类的构造函数及其重载,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 getTim

12、e() return hour.ToString()+:+minute.ToString()+:+second.ToString();,Console.WriteLine(t1=0,t1.getTime();,17,【例3.3】 构造函数初始化,using 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

13、Test public static void Main( ) Point a = 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=0,b.x=3, b.y=4,18,构造函数注意点:,若类中没有提供构造函数,则CLR会自动提供一个默认的构造函数 一旦类中提供了自定义的构造函数,系统则不提供默认的构造函

14、数 不必显示调用构造函数 实例构造函数不能被继承,19,派生类构造函数的调用,调用时机:创建派生类的对象时,即 new 构造函数不被继承 派生类构造函数在执行前, 首先显式或隐式地调用基类构造函数 默认调用基类的无参数构造函数 除非显式地指定调用有参数构造函数 this关键字引用类的当前实例 base关键字用于从派生类中访问基类的成员 调用基类上已被其他方法重写的方法 指定创建派生类实例时应调用的基类构造函数,20,【例3.4】 派生类构造函数及其调用,using System; class Point private int x, y; public Point() x = 0; y = 0

15、; Console.WriteLine (Point() constructor : 0 , this ); public 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

16、); public Circle (double radius ): base ( ) this.radius = radius; Console.WriteLine (Circle (radius) constructor : 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 M

17、ain() Point a = new Point(); Circle b = new Circle (3.5); Circle c = new Circle (1, 1, 4.8); Console.Read (); ,1,3,2,5,4,21,2)静态构造函数的声明 语法形式: 属性集信息 静态构造函数修饰符 标识符() 静态构造函数体 静态构造函数修饰符 extern static 或者static extern 。如有extern修饰,则是一个外部静态构造函数,不提供任何实际的实现,静态构造函数体仅仅是一个分号 标识符 是静态构造函数名,必须与类同名且不能有参数 静态构造函数体只能对静

18、态数据成员进行初始化,22,静态构造函数不可继承,不能直接调用 调用时机: 创建类的实例 引用类的任何静态成员 至多被执行一次 若类没有声明静态构造函数,而又包含带有初始设定的静态字段时,编译器会自动生成一个默认的静态构造函数,静态构造函数注意点:,23,2析构函数,语法形式: 属性集信息 extern 标识符 ( ) 析构函数体 标识符必须与类名相同,前面需加“” 析构函数不能写返回类型,也不能带参数,一个类最多只能有一个析构函数,24,析构函数注意点,析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用 派生类对象的析构函数调用链: 1)执行派生类的析构函数 2)执行基类的析构函数

19、,直到调用object类的析构函数为止,与执行构造函数的顺序相反,25,第3章 面向对象编程基础,1. 理解基本概念 2. 理解类 3. 使用构造函数 4. 学习方法 5. 学习属性,掌握,26,回顾,对象 具有属性和操作(方法)的实体 类 对象的抽象,抽象的数据类型 类是对象的模板 对象是类的具体化 或 类的实例,27,类的成员,1.类体中以类成员声明形式引入的类成员 包括:常数声明、字段声明、构造函数声明、析构函数声明、静态构造函数、方法声明、属性声明等 2. 直接从基类继承而来的成员,28,访问修饰符,public 访问不受限制 protected 只能被本身或派生类的实例访问 priv

20、ate 只能被本身访问 static 静态,非实例,29,构造函数,构造函数实例构造函数 与类名同名 在类进行new运算(即类实例化时) this :引用当前类的实例 base:用于从派生类中访问基类的成员 调用基类上已被其他方法重写的方法 指定创建派生类实例时应该调用的基类构造函数 调用顺序 先基类后派生类,30,3.3 方法,1. C#中所有的变量、方法都必须封装在类中 2. 对象间、类间只能通过类所提供的方法进行互操作 3. 从方法的声明、方法的参数、静态方法与实例方法、方法的重载与覆盖等方面理解,31,表3.2 方法修饰符,32,表3.3 修饰符的无效组合,33,【例3.6】 下面程序

21、中的StackTp类定义了 几个方法以模拟实现一个压栈操作。,using System; class StackTp int MaxSize; int 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; e

22、lse return false; public bool isFullStack() if (Top=MaxSize)return true; else return false; public 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

23、is + s1); for (int i=0; i20; i+) ST.push(i+1); if ( ST.isFullStack() ) / 调用方法 s1=Full; else s1=not Full; Console.WriteLine (Stack is + s1); Console.Read (); ,34,3.3.2 方法的参数,形参(形式参数):声明方法时包含的方法参数说明 实参(实际参数):调用方法时给出的实际参数 在C#中实参与形参有4种传递方式: 值参数 引用参数ref 输出参数out 参数数组params,1值参数 在方法声明时不加修饰的形参就是值参数,它表明实参与形参

24、之间按值传递 在方法中对形参的修改不影响外部的实参 属于输入参数,35,【例3.7】 演示了当方法Sort传递的是值参数时, 对形参的修改不影响其实参。,36,是值参数传递方式,形参另外分配一块内存,接受实参的引用值副本 1. 对引用值的修改不会影响实参 2. 如果改变的是所引用的对象,则将会影响实参所引用的对象,值参数传递引用对象,内存首地址,37,【例3.8】 程序演示的是当方法传递的是 一个引用对象(如数组)时,对形参的修改会影响到实参,改变了引用的对象,查询最小值,38,2. 引用参数,引用参数形参的改变影响实参 例3.7中 实际变量a、b、c是不随形参x、y、z的,但如果想改变实际变

25、量a、b、c的值,则用引用参数,39,【例3.7】 演示了当方法Sort传递的是值参数时, 对形参的修改不影响其实参。,40,2. 引用参数,引用参数形参的改变影响实参 例3.7中 实际变量a、b、c是不随形参x、y、z的,但如果想改变实际变量a、b、c的值,则用引用参数 C#用ref修饰符 声明 引用参数 引用参数不创建新的存储单元,与方法调用中的实际参数变量同处一个存储单元传递内存地址 属于输入参数,41,【例3.9】 将例3.7程序中Sort方法的值参数传递方式改成引用参数传递,这样在方法Sort中对参数x、y、z按从小到大的排序影响了调用它的实参a、b、c。,using System;

26、 class Myclass public void Sort (ref int x, ref int y, ref int z) int tmp; / tmp是方法Sort的局部变量 / 将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, re

27、f b, ref c); Console.WriteLine (a=0, b=1, c=2 , a, b, c ); Console.Read(); ,42,使用ref声明引用参数的注意: (1)方法的参数声明中ref关键字仅对紧跟在它后面的参数有效,而不能应用于整个参数表。 例如,Sort方法中x、y、z都要加ref修饰 (2)在方法的调用中也要用ref修饰实参,且实参必须为变量,实参和形参的数据类型必须完全匹配 (3)在方法外(方法调用前),ref参数必须明确赋值 (4) ref参数也可以用于传递引用类型的对象,43,第3章 面向对象编程基础,方法声明如同C语言的“函数” 访问修饰符默认为

28、public 方法参数 值参数(值类型、引用类型) 引用参数ref 输出参数out 参数数组params,方法,44,方法重载与覆盖 方法签名 方法覆盖new 和 虚方法virtual override 属性property get访问器 set访问器,45,3. 输出参数,1. 用法与ref参数相似, 但为输出参数值 2. 只能用于从方法中传出值, 因此必须在方法结束之前对out参数赋值 3. 在参数前加out修饰符的形式参数 4. out参数也可以用于传递引用类型的对象,46,【例3.10】 求一个数组中元素的最大值、最小值和平均值。,using System; class Myclass

29、 public void MaxMinArray (int a, out int max, out int 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; ,47,【例3.11】 下面程序定义了两个方法,一个是Swap1,一个是Swap2,它们都有两个引用对象作为参数,但Swap2的参数加了ref修饰,调用这两个方法产生的结果是不一样的。,using System; class My

30、class public void Swap1 (string s, string t) string tmp; tmp=s; s=t; t=tmp; public 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 ); C

31、onsole.WriteLine (s2=0 , s2 ); m.Swap2(ref s1, ref s2); Console.WriteLine (s1=0 , s1 ); Console.WriteLine (s2=0 , s2 ); Console.Read (); ,s1,s2的引用 并没有改变,s1,s2的引用 互相交换了,48,4参数数组,3.3.3 静态方法与实例方法,特点:参数为可变长度 使用params关键字来指定一个可变长度的参数表 注意: 1. 一个方法中只能声明一个params参数 2. params参数必须放在参数表最后 3. params参数是一个一维数组,参数数组

32、的参数:0n 4. params不可与ref、out修饰符组合使用,1. 静态方法用static修饰 2. 只能访问类中的静态成员,49,【例3.12】 下面程序演示了Myclass类中的方法MaxMin有一个参数 数组类型的参数,在调用这个方法时具有灵活性。,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 ;

33、for (int i=1; imax) max=ai; if (aimin) min=ai; ,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 ); m.MaxMin (out smax, out smin, 45, 76

34、, 89, 90 ); / 在4个数之间找最大、最小 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 (); ,50,3.3.4 方法的重载与覆盖,方法重载 同一个类中存在具有相同方法名,但具有不同的形式参数个数、修饰符及类型的两个或两个以上的方法。 重载是多态的形式之一。编译时根据调用时给出的实参个数和类型调用相应的方法

35、,以实现多态 方法签名:方法名、形参个数、形参修饰符、形参类型 一起构成方法签名,51,【例3.14】 下面程序定义的Myclass类中含有4个名为max的方法,但它们或者参数个数不同,或者参数类型不同,在Main调用该方法时,编译器会根据参数的个数和类型确定调用哪个max方法。,using System; class Myclass public int max (int x, int y) return x=y ? x : y ; public double max (double x, double y) return x=y ? x : y ; public int max (int

36、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; 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,

37、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 (); ,52,方法的覆盖使用new隐藏有相同签名的方法,1. 当派生类与基类有相同名称或签名的成员时,在派生类中默认隐藏基类成员,但提示警告 2. 在派生类成员声明中加new修饰符,可以取消警告信息 3. 基类对象被引用到派生类对

38、象时,访问的仍是基类的方法,静态多态,53,【例3.15】 定义了一个基类Shape,含有字段域width和height,分别表示形状的宽和高,并定义了一个area方法,求形状的面积。它的派生类Triangle和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,

39、 double h ) width=w;height=h; public double area ( ) return width*height; class Triangle : Shape / 三角形 public Triangle (double x, double y):base(x,y) new public double area ( ) / 派生类方法与基类方法同名,编译时会有警告信息 return width*height/2 ; class Trapezia : Shape / 梯形 double width2 ; public Trapezia(double w1, dou

40、ble w2, double h) : base (w1, h) width2=w2; new public double area ( ) / 加new隐藏基类的area方法 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的ar

41、ea方法 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.area(); / 调Shape的area方法 A = C; Console.WriteLine(A.area= 0 , A.area(); / 调Shape的area方法 Console.Read(); ,基类 方法,54,虚方

42、法:基类的方法用关键字virtual修饰 对基类的虚方法重载:派生类用关键字override修饰与基类中虚方法有相同签名的方法 注意: (1)不能将虚方法声明为静态的(static) (2)不能将虚方法声明为私有的(private) (3)覆盖方法必须与它相关的虚方法匹配 (4)一个覆盖方法覆盖的必须是虚方法,实现运行时多态(动态绑定),55,【例3.16】 将例3.15改写,Shape类中的方法area用virtual修饰,而派生类 Triangle和Trapezia用override修饰area方法。,using System; class Shape protected double w

43、idth; 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修饰符声明一个虚方法 return width*height; class Triangle: Shape / 三角形 public Triangle (double x, double y):base

44、(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 ( ) 派生类中用override修饰符覆盖基类虚方法 return (width+width2)*height/2 ; ,clas

45、s 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.area(); / 调Trapezia的area方法 A =

46、B; Console.WriteLine(A.area= 0 , A.area(); / 调派生类Triangle的area方法 A = C; Console.WriteLine(A.area= 0 , A.area(); / 调派生类 Trapezia的area方法 Console.Read(); ,派生类 方法,56,3.4 属性property,回顾一下 例3.2(P51)。 为了实现良好的数据封装和数据隐藏,类的字段成员的访问属性一般设置成private(默认)或protected 利用public 方法来访问私有的或受保护的字段,57,【例3.2】 Time类的构造函数及其重载,us

47、ing 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; ,class Test static void Main() Time

48、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(); ,58,3.4 属性,保持原有的数据封装和数据隐藏,类的字段成员的访问属性仍然设置成private(默认)或protected? 不利用public方法来访问私有的或受保护的字段 属性(property) 属性值的读/写与字段域语法相同; 利用get和set访问器实现属性值的读/写,如何做?

49、,59,语法形式: 属性集信息 属性修饰符 类型 成员名 访问器声明 属性修饰符与方法修饰符(public,private,protected,)相同,包括new、static、virtual、abstract、override和4种访问修饰符的合法组合,遵循相同的规则。 访问器声明声明属性的访问器,get访问器或set访问器,或者两个 语法形式: get / 读访问器 / 访问器语句块 set / 写访问器 / 访问器语句块 ,属性的声明方法,60,1. get访问器 1. 返回值类型与属性的类型相同 2. 在语句块中的return语句必须有一个可隐式转换为属性类型的表达式 2. set访问

50、器 1. 没有返回值 2. 有一个隐式的值参数value,类型与属性的类型相同。 3. 属性的种类 1. 读/写属性:同时包含get和set访问器的属性 2.只读/只写属性:只包含get或set访问器的属性,属性中的访问器使用注意,61,【例3.17】 对TextBox类的text、fontname、fontsize、multiline域 提供属性方式的读/写访问。,using System; class TextBox private string text; private string fontname; private int fontsize; private bool multil

51、ine; 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; public bool

52、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=

53、0 , Text1.FontName); Text1.FontSize=36; Text1.MultiLine = true; Console.WriteLine (Text1.FontSize= 0 , Text1.FontSize); Console.Read (); ,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

54、Point ( ) x=y=0; public 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 Labe

55、l (); Console.WriteLine (Label1.Width= 0 , Label1.Width); Console.WriteLine (Label1.Height= 0 , Label1.Height); Console.Read (); ,63,3.5 综合应用实例,【例3.19】 学生成绩管理程序。根据学生选修的课程及课程学分和课程成绩计算GPA,最后按GPA的值对学生进行排序。 基本思路:本程序的学生总人数、课程名、课程学分可以由控制台输入,为叙述简单,假定每个学生所选修的课程相同。 Course类中定义了课程名、课程学分字段域,Name属性、构造函数。 Student类中定义 字段: 学生姓名、学号、选修课程数、Course类对象数组、成绩和GPA等 属性: CourseNum静态属性、GPA属性、Name属性 方法:SetCourse方法设置课程名,静态方法 AddData方法给每个学生加入姓名、学号、成绩。ComputeGPA 方法计算学生成绩的GPA stuSwap方法对两个Student对象内容进行交换。,64,class Course string courseName; / 课程名 int courseMark; / 课程学分 public Course() public Course(string Name, i

温馨提示

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

评论

0/150

提交评论