1、 第3章 面向对象的C#语言本章内容n类、域、方法n属性、索引n类的继承n修饰符n接口n结构与枚举n面向对象:继承、封装、多态nUML类图简介3.1 类、域、方法定义类中的域和方法class Person public string name;public int age;public void sayHello()Console.WriteLine(Hello!My name is +name);public string getInfo()return Name:+name+,Age:+age;构造方法 n(1)构造方法的方法名与类名相同。n(2)构造方法没有返回类型,也不能写void。n
2、(3)构造方法的主要作用是完成对象的初始化工作。n(4)构造方法一般不能显式地直接调用,而是用new来调用。缺省构造方法 npublic Person()析构方法 nclass Person nn Person()nnn对象的创建nPerson p=new Person(“Liming”,20);name p age 对象的使用nConsole.WriteLine(p.name);np.sayHello();方法的重载,签名 public void sayHello()Console.WriteLine(Hello!My name is +name);public void sayHello(
3、Person another)Console.WriteLine(Hello,+another.name+!My name is +name);OverloadingTest.cs使用this public Person(int age,string name)this.age=age;this.name=name;public Person():this(0,)/构造方法的其他语句;应用示例:银行系统n系统中有几类对象?Account,Bank,ATMn每个类中有什么域、方法?3.2 属性、索引 使用属性、索引的示例n使用属性 button1.Text nbutton1.Text=“说你好”
4、;n含义相当于button1.SetText(“说你好”);nString s=button1.Text;n含义相当于s=button1.GetText();n使用属性 string s=“abcde”;n求出长度:s.Lengthn含义上相当于s.GetLength();n使用索引 string s=“abcde”;n求出第0个字符:s0n含义上相当于s.Get(0)private string myName;public string Nameget return myName;set myName=value;对属性进行访问 nPerson p=new Person();np.Name=
5、“Li Ming”;nConsole.WriteLine(p.Name);n编译器产生的方法是:nvoid set_Name(string value);nstring get_Name();PersonProperty.cs属性与域的比较 n(1)属性可以实现只读或只写,而域不能。n(2)属性的set方法可以对用户指定的值(value),进行有效性检查,从而保证只有正确的状态才会得到设置,而域不能。n(3)属性的get方法不仅可以返回域变量的值,还可以返回一些经过计算或处理过的数据,如上例中的只读属性Info,它返回的由Name及Age组合过的字符串。n(4)由于属性在实现时,实际上是方法,
6、所以可以具有方法的一些优点,如可以定义抽象属性等等。索引(Indexer)修饰符 类型名 this 参数列表 set get使用索引 n对象名 参数 n编译器自动产生两个方法,以供调用:nT get_Item(P);nvoid set_Item(P,T value);IndexerRecord.cs属性与索引的比较 属属 性性索索 引引通过名称标识通过参数列表进行标识通过简单名称来访问通过运算符来访问可以用static修饰不能用static修饰属性的get访问器没有参数索引的get访问器具有与索引相同的参数列表属性的set访问器包含隐式value参数除了value参数外,索引的set访问器还具
7、有与索引相同的参数列表IndexerBitArray.cs3.3 类的继承 使用继承的示例n我们定义的窗体npublic class Form1:System.Windows.Forms.Form继承(inheritance)n子类subclass、父类baseclassn单继承n所有的类都是通过直接或间接地继承object(即System.Object)得到的。class SubClass:BaseClass 示例class Student :Person/.继承n子类自动地从父类那里继承所有域、方法、属性、索引等成员作为自己的成员。n除了继承父类的成员外,子类还可以添加新的成员,还可以隐藏
8、或修改父类的成员。域的继承、添加与隐藏 class Apublic int a;class B:Anew public int a;方法的继承、添加n方法的继承n方法的添加与父类同名的方法n一是定义同名、但参数列表(签名)与父类不同的方法,这称为对父类方法的重载(OverloadingOverloading)n二是定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用newnew表示n三是定义同名且参数列表也与父类相同的方法,而且父类的方法用了abstract或virtual进行了修饰,子类的同名方法用了override进行了修饰,这称为虚方法的覆盖(OverridingOverrid
9、ing)。InheritFieldMethod.cs使用base void sayHello()base.sayHello();Console.WriteLine(My school is +school);Student(string name,int age,string school):base(name,age)this.school=school;父类与子类的转换 Person p1=new Person();Person p2=new Student();Student s1=new Student();Student s2=new Student();p1=s1;/可以,因为Pe
10、rson类型的变量可以引用Student对象s2=p1;/不行,因为会产生编译错误s2=(Student)p1;/编译时可以通过,运行时则会出现类型不能转换的异常s2=(Student)p2;/正确,因为p2引用的正好是Student对象实例as运算符n如果不能转换,则值为nullnStudent s3=p1 as Student;/结果s3为nullnStudent s4=p2 as Student;/s4被赋值n与强制类型转换的差别nas只能针对引用型变量n如果不能转换,as运算不会引起异常,只是值为null is运算符nif(p is Person)n判断一个对象是不能某个类(及其子类)
11、的实例typeof()运算符n获得其运行时的类型nType t=typeof(变量);nType t=typeof(类名);属性、索引的继承 3.4 修饰符 访问控制符 访问控制访问控制符符同类同类中中相同程序集相同程序集的子类的子类相同程序集相同程序集的非子类的非子类不同程序集不同程序集的子类的子类不同程序集不同程序集的非子类的非子类publicYesYesYesYesYesprotected internalYesYesYesYes protectedYesYes Yes internalYesYesYes privateYes static nstatic的域、方法、属性是属于整个类的n
12、static方法中,不能访问实例变量 n调用static方法时,直接用类名访问 nConsole.Write();Math.Sqrt();nConvert.ToDateTime();DateTime.ParsenString.Copy(a);String.Format(“0”,x)nstatic变量可以用来表示“全局变量”n在c#2.0中,类名也可以用static来修饰StaicAndInstance.csstatic构造方法 class Person static long totalNum;static Person()totalNum=(long)52e8;Console.WriteLi
13、ne(人类总人口+totalNum);static方法只会调用一次,但其调用时间是不确定的。const及readonly nconst相当于静态常量n如Math.PInreadonly相当于不可改量,只能赋一次值n如String.Emptyn在构造方法中赋值,或者在声明时就赋值n注:nconst 只能用于基本类型及string(如果用于其他类型则无意义,因为只能为null值)。nreadonly只能修饰域,而const还可以修饰局部变量Constans.csReadonlyColor.cssealed及abstract nsealed类,不可继承(也有利于编译优化)n如String Conso
14、le Math Convert Graphics Fontnabstract类,不可实例化(new)n如Array,RandomNumberGeneratornabstract的方法体,不用,用;nabstract 类型 方法名(参数列表);nabstract 类型 属性名get;set;抽象类表示了其子类的属性AbstractShapeTest.cs3.5 接口 接口(interface)n相似于抽象类n一个抽象成员的集合n如:ICloneable,IComparable,IConvertible,IDisposable,IFormattable,IEnumerable 帮助实现多重继承接口
15、的用处 n实现不相关类的相同行为 n需要考虑这些类之间的层次关系 n通过接口可以了解对象的交互界面,而不需了解对象所对应的类 n例如:npublic sealed class String:IComparable,ICloneable,IConvertible,IEnumerable定义一个接口 public interface ISringListvoid Add(string s);int Count get;string thisint index get;set;实现接口 class 类名:父类,接口,接口,接口TestInterface.cs显式接口成员实现 n方法名前写接口名nvo
16、id IWindow.Close()n调用时,只能用接口调用n(IWindow)f).Close();n在不同接口的方法相同时,能消除歧义 InterfaceExplicitImpl.cs3.6 结构及枚举 结构struct结构,如:Point,Color,Size,DateTime,Int32 struct 结构名 :接口名结构是隐式sealed;因此它们不能被继承。使用struct要注意nstruct是值类型n结构不能包含无参数构造方法 n每个域在定义时,不能给初始值n构造方法中,必须对每个域进行赋值n实例化时,使用new,但与引用型变量的内存是不同的n值类型变量在赋值时,实行的是域的co
17、pyStructNew.csStructPoint.cs枚举(enum)如FontStyle,GraphicsUnit,KnownColor,DockStyle,DialogResult声明自己的属性enum MyColor (注:后者可以跟一个:int)Red,Green=1,Blue=2EnumColor.cs使用枚举nMyColor c=MyColor.Red;nConsole.WriteLine(c.ToString();nc =n(MyColor)Enum.Parse(typeof(MyColor),Red);3.7 面向对象编程面向对象OOnObject Oriented方法的三大
18、特点n继承 inheritancen子类继承父类的成员,还可增加、调用、隐藏n提高软件模块的可重用性和可扩充性n封装 encapsulationn使用接口,而不关心具体的类n使用属性,而将域设为privaten多态 polymorphismn相同的方法,不同的参数n自动调用子类相应的方法(虚方法调用,以后讲)UML类图简介nUML,统一建模语言n有类图、状态图、时序图等多种图形VS中的类关系图n在项目上,点右键,”查看类关系图“n添加新项,其他项,类关系图UML工具nIBM Rational XDE for.NETnBorland TogethernMicrosoft Vision正向工程,由UML图自动产生代码n反向工程,由代码自动产生UML图小结n类class、接口interfacen结构struct、枚举enumn类的成员:域、方法、属性、索引n修饰词npublic protected internal privatenstaic const readonly abstract sealednOO与UML练习n参见讲义及ch03目录进一步阅读n书稿3 类和接口.docnC#语言规范nhttp:/ 问题与讨论