类类与对象类与对象•–类是一个样板,以操作、表示和算法的形式完整地定义了一组对象的行为。它通常也是面向对象语言中的模块化、封装和数据抽象的基础。•–对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。类与对象类与封装封装•隐藏对象的信息•留出访问的接口属性的封装在C#程序中我们通常使用属性对字段进行封装方法(一)方法(二)方法(三)PublicvoidPlayGame()//方法的声明{//方法的实现Console.WriteLine(“我是头号玩家!”);}方法(四)•无参方法的调用Child.PlayBall();•带参方法的调用Child.Sports(参数);方法的重载•同一个类中,多个方法名字相同,但参数(类型或数量)不同ClassChlid{……publicvoidSports(stringsport);{//代码}publicvoidSports(intcount);{//代码}}构造方法(一)ChildxMing=newChild();//调用构造方法作用:为属性赋值注:如果没有显示的定义构造方法,则会有一个默认的无参数的构造方法;如果定义了构造方法,则没有默认构造方法;构造方法(二)•只能用new方法名()的形式调用构造方法;•构造方法通常声明为public;•构造方法没有返回值类型;•构造方法名必须与类名相同;构造方法(三)•构造方法的重载:与普通方法的重载相同;•注意:当我们定义了有参构造方法后,就不能再有默认的无参构造方法了;构造方法(四)对象的初始化:Childxiaozhu=newChild(){Name=“佩奇”,Age=5};注:类里面要包含一个无参构造方法值类型Inta=3;Intb=a;--a;赋值会创建值的副本,修改任一个副本,不影响其它副本。引用类型•引用类型变量存储对象的内存地址,赋值不会创建值的副本,只会创建地址的副本,修改任何一个副本,也同时修改其他的副本。传参•引用类型参数,按引用传参,方法修改形参,实参也会被相应的修改;•值类型参数,按值传参,方法修改形参,实参不会被修改;结构(一)•结构(struct)是能够包含数据成员和函数成员的数据结构。•结构类型的变量直接存储该结构的数据。•所有结构类型都隐式地从类型System.ValueType继承。•System.ValueType继承自System.Object。•结构是值类型,不需要在堆分配•结构类型不允许继承。结构类型不允许继承。结构(二)•//用struct修饰,表示一个结构类型•structPoint•{•publicintx;•publicinty;•publicPoint(intx,inty)•{•this.x=x;•this.y=y;•}•}结构(三)•结构中可以定义字段、属性和方法;•不能为结构中的字段赋初值;•结构的构造方法中必须为所有字段赋值;•不能为结构显示定义无参数的构造方法;•结构类型的对象可以不实例化;枚举(一)•枚举(enum)是具有一组命名常量的独特的值(结构)类型•每个枚举类型都有一个相应的整型类型,称为该枚举类型的基础类型(underlyingtype)。没有显式声明基础类型的枚举类型所对应的基础类型是int。枚举类型的存储格式和取值范围由其基础类型确定。•所有枚举类型默认继承自System.Enum类型,System.Enum继承自System.ValueType。故枚举为结构类型。枚举(二)//:long表示基础类型是long//如果不写则默认为intenumAlignment:long{//=也可不写,默认则是以0开始,依次加1Left=-1,Center=0,Right=1}类与继承继承(一)•为什么需要继承减少重复的代码•实现继承一个类派生于另一个基类,它拥有该基础类型的所有成员字段和函数继承(二)•语法classChildClass:ParentClass{……}子类是父类的一种特殊情况或者具体情况继承(三)•特殊基类ObjectObject类是所有类的共同基类,它是唯一的非派生类,继承层级结构的基础。•规则继承只有单继承,也就是只能继承一个父类,当然该父类可以继承自一个祖父类,直到object类。隐藏方法•用与基类成员名称相同的成员来屏蔽基类成员•语法:屏蔽数据成员:在派生类中声明名称和类型相同的成员;屏蔽方法成员:在派生类中声明新的带有相同方法签名的成员;添加new关键字,否则可能报错;构造方法•派生类对象中,包含基类部分,在执行派生类的构造方法之前,将会隐式或显式的调用基类构造方法;•调用顺序:实例成员初始化基类构造方法派生类构造方法类与多态多态•基类描述了共同的属性和行为。但是,子类具有差异性,统一的行为在基类和派生类中也有所区别。•为了兼顾共性又能体现出个性,我们可以使用虚方法和多态的武器。虚方法和多态(一)•声明为virtual的方法就是虚方法。基类的虚方法可以在派生类中使用override进行重写。•通过指向派生类的基类引用,调用虚方法,会根据引用所指向派生类的实际类型,调用派生类中的同名重写方法,便是多态。虚方法和多态(二)重写虚方法必须具有相同的可访问性,且基类方法必须是非private;不能重写static方法或者非虚方法;方法,属性,索引器,事件,都可以声明为virtual。抽象方法和抽象类(一)•抽象方法abstractpublicvoidFunc();注:抽象方法不能有实体,包含抽象方法的类必须声明为抽象类;抽象方法和抽象类(二)•抽象类abstractclassStudent{……}抽象方法和抽象类(三)•抽象类用abstract修饰;抽象类不能实例化;抽象类中可以包含抽象成员和普通成员,以及他们的任意组合;抽象类的抽象成员在派生类中需要用override关键字实现密闭方法和密闭类(一)•有些方法不希望被重写,有些类不希望通过继承而被修改,那么可以用sealed去修饰;•基类方法不允许子类对其重写时,可以不声明为virtual;•派生类中的方法不允许其子类对其重写,同时该方法是override的,就可以使用sealed。接口接口(一)接口的语法结构:publicinterfaceIexam:基接口列表{voidExam();{接口(二)•对接口方法的调用与类中的情况相同。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将屏蔽掉同名的高层成员。接口(三)•接口成员访问权限为public,但不能加访问修饰符;•接口成员不能有定义;•接口的成员必须是方法,属性,事件或索引器,不能包含常数、字段、运算符等;接口(四)•只能用来被实现classArtStudent:Iexam,ISport{publicvoidExam(){……}}接口(五)•接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性,在实现时需要进行显式的声明,且显式接口成员为private。索引索引(一)•索引器允许类或者结构的实例按照与数组相同的方式进行索引。访问修饰符类型名this[参数列表]{get{……}set{……}}索引(一)•索引器允许用户按照处理数组的方式索引类,访问时有两种形式使用索引器可以直接访问类实例;将数组声明为public成员并直接访问数组的成员;