(4.1)-第3章面向对象的C#语言_第1页
(4.1)-第3章面向对象的C#语言_第2页
(4.1)-第3章面向对象的C#语言_第3页
(4.1)-第3章面向对象的C#语言_第4页
(4.1)-第3章面向对象的C#语言_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

1C#程序设计语言2第三章

面向对象的C#语言3第三章面向对象的C#语言01面向对象概念02类、字段、方法03属性、索引04类的继承05修饰符06接口07面向对象编程基本概念01面向对象概念类与对象对象现实世界中的实体(世间万物皆对象);在面向对象程序设计中,对象是具有属性和操作(方法)的实体;对象的属性表示了它所处的状态;对象的操作则用来改变对象的状态达到特定的功能。类:具有相似属性和方法的对象的集合对象的三要素属性(对象是什么)、方法(对象能做什么)、事件(对象如何响应)相互关系类是对象的抽象,对象是类的实例,类是一种抽象的分类,对象则是具体事物。对象、类、实例化面向对象编程(Object-OrientedProgramming)简称OOP技术,是开发计算机应用程序的一种新方法、新思想。现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:01面向对象概念对象=(算法+数据结构)程序=(对象+对象+……)01面向对象概念对象类(抽象化)类对象(具体化)6Shape王艳2年级3班刘强5年级1班范小飞2年级1班Student封装面向对象程序设计语言的三大原则01面向对象概念

为用户提供对象

的属性和行为的

接口

用户通过这些接口使用这

些类

无须知道这些类内

部是如何构成的

不能操

作类中的内部数据

类将内部数据隐藏

继承面向对象程序设计语言的三大原则01面向对象概念多态面向对象程序设计语言的三大原则

多态性就其字面上的意思是:多种形式或多种形态。在面向对象编程中,多态是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。例如,问甲同学:“现在几点钟”,甲看一看表回答说:“3点15分”,又问乙同学:“现在几点钟”,乙想一想回答说:“大概3点多钟”,又问丙同学:“现在几点钟”,丙干脆回答说:“不知道”。这就是同一个消息发给不同的对象,不同的对象可以做出不同的反应。

继承中提到了父类和子类,其实将父类对象应用于子类的特征就是多态。依然以图形类来说明多态,每个图形都拥有绘制自己的能力,这个能力可以看作是该类具有的行为,如果将子类的对象统一看作是父类的实例对象,这样当绘制任何图形时,可以简单地调用父类也就是图形类绘制图形的方法即可绘制任何图形,这就是多态最基本的思想。01面向对象概念类的基本概念02类、字段、方法

类是一种数据结构,它定义数据和操作这些数据的代码,它可以包含数据成员(常量和域)、函数成员(方法、属性、事件、索引器、运算符、构造函数和析构函数)和嵌套类型。

类(class)实际上是对某种类型的对象定义变量和方法的原型,它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。类的声明02类、字段、方法类修饰符class类名{

类成员}publicclassCar{publicintnumber;

publicstringcolor;

privatestringbrand; }语法完整的语法形式:[属性集信息]opt[类修饰符]optclass类名[:类基]opt

{ [类主体]opt}类修饰符:可以是以下表所列的几种之一或者是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。类基:它定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object。修饰符作用说明public表示不限制对类的访问。类的访问权限省略时默认为publicprotected表示该类只能被这个类的成员或派生类成员访问private表示该类只能被这个类的成员访问internal表示该类能够由程序集中的所有文件使用,而不能由程序集之外的对象使用new只允许用在嵌套类中,它表示所修饰的类会隐藏继承下来的同名成员abstract表示这是一个抽象类,该类含有抽象成员,因此不能被实例化,只能用作基类sealed表示这是一个密封类,不能从这个类再派生出其他类。显然密封类不能同时为抽象类属性集信息:是C#语言提供给程序员为程序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。安全性设置([SecuritySafeCritical])等等。类的成员02类、字段、方法类的定义包括类头和类体两部分,其中类头就是使用class关键字定义的类名,而类体是用一对大花括号{}括起来,类体用于定义该类的成员。类的成员包括字段、属性、方法、构造函数、事件、索引器等。类体语法形式:

{ [类成员声明]opt

}类成员由两部分组成,一个是类体中以类成员声明形式引入的类成员,另一个则是直接从它的基类继承而来的成员。字段和方法02类、字段、方法类(class)最基本的要素是字段(field):常量或者变量常数和只读字段静态字段实例字段方法(method):函数类代表对象所能提供的服务classPerson{publicstringname;publicintage;publicvoidSayHello(){ Console.WriteLine("Hello!Mynameis"+name);}publicstringGetInfo(){ return"Name:"+name+",Age:"+age;}}字段02类、字段、方法常数和只读字段不变字段(const)只读字段(readonly)静态字段被类的所有实例所共享,即此类的所有实例都访问同一内存地址实例字段属于类或结构的单个实例(对象)classBankCard

{

//常数字段不允许使用static修饰符,但它和静态成员一样只能通过类访问。publicconst

intX=10;

constdoublePI=3.14159;//缺省访问修饰符,即约定为privateconstdoubleY=0.618+3.14;publicreadonlystringreadOnlyCur="人民币";//只读字段,字段定义时候赋值、或在构造函数中进行初始化publicstaticstringCur="人民币";//静态字段publicdecimalmoney;//实例字段

}classTest

{publicstaticvoidMain()

{

BankCardm=newBankCard();

BankCard.Cur="港币";

Console.WriteLine("X={0},readOnlyCur={1},Cur={2}",

BankCard.X,m.readOnlyCur,BankCard.Cur);

}

}构造方法(函数)02类、字段、方法构造方法的主要作用是完成对象的初始化工作构造函数是在创建给定类型的对象时执行的类方法,构造函数具有与类相同的名称,它通常初始化新对象的数据成员。构造方法的方法名与类名相同。构造方法没有返回类型,也不能写void。publicPerson(stringn,inta){name=n;age=a;}如果用户没有定义任何构造方法,

则系统会自动产生一个publicPerson(){}构造方法(函数)和析构方法(函数)02类、字段、方法构造方法的主要作用是完成对象的初始化工作构造函数是在创建给定类型的对象时执行的类方法,构造函数具有与类相同的名称,它通常初始化新对象的数据成员。构造方法的方法名与类名相同。构造方法没有返回类型,也不能写void。如果用户没有定义任何构造方法,

则系统会自动产生一个publicPerson(){}析构方法的主要作用是完成对象的释放工作析构函数是以类名加~来命名的。.NET

Framework类库有垃圾回收功能,当某个类的实例被认为是不再有效,并符合析构条件时,.NET

Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收。~Program() //析构函数{

Console.WriteLine("析构函数自动调用");}由于C#自动进行对象的释放,所以用户一般不定义析构方法publicPerson(stringn,inta){name=n;age=a;}对象的创建及使用

对象的创建Testtest=newTest();Testtest=newTest("a");cStockInfo

stockInfo=newcStockInfo();stockInfo.FullName="笔记本电脑";stockInfo.ShowGoods();访问对象的属性和行为

对象的引用Bookbook;或:Bookbook=newBook();

对象的销毁02类、字段、方法this关键字02类、字段、方法C#语言中可以使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法。this指这个对象本身,常用于:访问这个对象的字段及方法(VS会智能提示)区分字段与局部变量publicPerson(intage,stringname){this.age=age;=name;}用于构造方法调用另一个构造方法,注意其位置publicPerson():this(0,""){//构造方法的其他语句;}namespaceDemo{publicclassTest{publicTest(){Console.WriteLine("无参构造函数");}//这里的this()指向的是Test()无参构造函数,相当于继承了无参构造函数

publicTest(stringtext):this(){//程序进来后会先执行Test()无参函数,然后继续往下边执行

Console.WriteLine(text);Console.WriteLine("有参构造函数");}}classProgram{staticvoidMain(string[]args){try{Testtest=newTest("张三");}catch(Exceptionex){Console.WriteLine(ex);}finally{Console.ReadLine();}}}}方法02类、字段、方法方法是按照一定格式组织的一段程序代码,在类中用方法声明的方式来定义。代表对象所能提供的服务。方法的声明classCircle{publicdoubler=1.0;publicvoidScale(doubled){r=r*d;}}[属性集信息]opt[方法修饰符]opt

返回类型方法名([形参表]opt

){

方法体}方法修饰符中public、protected、private、internal、protectedinternal属于访问修饰符,用于表示访问的级别,默认情况下,方法的访问级别为public。访问修饰符也可以和其它的方法修饰符有效地组合在一起,但某些修饰符是互相排斥的。修饰符不能与下列选项一起使用

staticvirtual、abstract和overridevirtualstatic、abstract和overrideoverridenew、static和virtualabstractvirtual和staticnewoverrideexternabstract方法的声明02类、字段、方法返回类型方法可以返回值也可以不返回值,如果返回值,则需要说明返回值的类型,它可以是任何一种C#的数据类型,在方法体内是通过return语句将数据交给调用者。如果方法不返回值,则它的返回类型可标为void,当然缺省情况下,默认为void。方法名每个方法都有一个名称,一般可以按标识符的起名规则随意给定方法名,不过要记住Main()是为开始执行程序的方法预留的,另外不要使用C#的关键字作为方法名。为了使方法容易理解和记忆,建议方法的命名尽可能地同所要进行的操作联系起来,就是我们通常说的顾名思义。形参表是由零个或多个用逗号分隔的形式参数组成的,形式参数可用属性、参数修饰符、类型等描述。当形参表为空时,外面的圆括号也不能省略。方法体

是用花括号括起的一个语句块。方法的声明02类、字段、方法形参与实参方法定义中声明的参数叫做形式参数,简称形参;实际调用时传递给方法的参数叫做实际参数,简称实参。二者名称不一定相同,但类型必须一致,或实参必须是能隐式转换为形参的类型。形参:在未出现方法调用时,他们并不占内存中的存储单元,只有在发生方法调用时,方法中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。实参:实参可以是常量、变量和表达式,但要求有确定的值。在调用时将实参的值赋给形参。在内存中,实参单元和形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留原值。classCircle{publicdoubler=1.0;publicvoidScale(doubled){r=r*d;}}形参Circlec=newCircle(){r=2.0};doubled=1.5,d1=2.0;c.Scale(d);c.Scale(d1);实参实参方法的参数02类、字段、方法值类型参数:不改变实参的值

值类型参数就是在声明时不加修饰的参数,它表明实参与形参之间按值传递。由于是值类型的传递方式,所以,在方法中对形参的修改并不会影响实参。publicvoidSwap(intx,inty){inttemp=x;x=y;y=temp;}intx=5,y=10;Swap(x,y);x:5y:10x:5y:10方法的参数02类、字段、方法引用型参数(ref):改变实参的值

引用型参数使形参按引用传递,其效果是:在方法中对形参所做的任何更改都将反映在实参中。如果要使用引用型参数,则方法声明和方法调用都必须显式使用ref关键字。publicvoidSwap(refintx,refinty){inttemp=x;x=y;y=temp;}intx=5,y=10;Swap(refx,refy);x:5y:10x:10y:5方法的参数02类、字段、方法输出型参数(out):形参需要初始化,实参无需初始化

在参数前加out修饰符的被称为输出型参数,它与ref参数很相似,只有一点除外,就是它只能用于从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。主要用途:多个返回值。publicdoubleCompute(outdoublep){doublet=Pi*r;p=2*t;returnt*r;}Circlec=newCircle(){r=7.2};doublep;doublea=c.Compute(outp);方法的参数02类、字段、方法数组型参数(params):可传递不同数量的参数声明方法时,如果有多个相同类型的参数,可以定义为数组型参数。params参数是一个一维数组,主要用来指定在参数数目可变时所采用的方法参数。publicdoubleSum(paramsdouble[]array){

ints=0;

foreach(doublexinarray)s+=x;returns;}doubley1=Sum(0.1,0.2,0.3);doubley1=Sum(0.5,1.0,1.5,1.8,2.4);方法的参数02类、字段、方法数组型参数(params):可传递不同数量的参数声明方法时,如果有多个相同类型的参数,可以定义为数组型参数。params参数是一个一维数组,主要用来指定在参数数目可变时所采用的方法参数。publicdoubleSum(paramsdouble[]array){

ints=0;

foreach(doublexinarray)s+=x;returns;}doubley1=Sum(0.1,0.2,0.3);doubley1=Sum(0.5,1.0,1.5,1.8,2.4);静态方法与实例方法02类、字段、方法静态方法

静态方法不对特定实例进行操作,在静态方法中引用this会导致编译错误,调用静态方法时,使用类名直接调用。publicstatic

intAdd(intx,inty){returnx+y;}staticvoidMain(string[]args){

Console.WriteLine("{0}+{1}={2}",23,34,Program.Add(23,34));

Console.ReadLine();}静态方法与实例方法02类、字段、方法实例方法实例方法是对类的某个给定的实例进行操作,使用实例方法时,需要使用类的对象调用,而且可以用this来访问该方法。publicintAdd(intx,inty){returnx+y;}staticvoidMain(string[]args){Programpro=newProgram();

Console.WriteLine("{0}+{1}={2}",23,34,pro.Add(23,34));

Console.ReadLine();}方法的重载02类、字段、方法方法重载是指方法名相同,但参数的数据类型、个数或顺序不同的方法(参数名不算)。publicdoubleAdd(intx,doubley){returnx+y;}publicintAdd(intx,inty,intz){returnx+y+z;}.net中不允许两个方法的名称和参数列表完全相同,而仅仅是返回类型不同。intAdd(intx){returnx+1;}voidAdd(intx){x=x+1;}参数类型中一个是普通类型,另一个是ref或out类型,这两个参数可以视为不同类型。intAdd(intx){returnx+1;}voidAdd(refintx){x=x+1;}参数类型中一个是ref类型,另一个是out类型,不足以标识不同的方法。intAdd(outintx){x=1;}voidAdd(refintx){x=x+1;}方法的重载02类、字段、方法可选参数允许在方法定义时为参数指定默认值;如果在调用时未指定这些参数值,那么就视这些参数的指为默认值。classRectangle{publicdoubleWidth=1,Height=1;publicvoidScale(doubled1,doubled2=1.0){Width=Width*d1;Height=Height*d2;}}Rectangler1=newRectangle();r1.Scale(1.5,3.0);r1.Scale(2.0);d2=1.0方法的重载02类、字段、方法命名参数在方法调用中同时指定参数的名称和值,这样就不必考虑方法定义中参数出现的顺序。很多情况下,将可选参数和命名参数结合起来使用才能发挥更大的作用。classRectangle{publicdoubleWidth=1,Height=1;publicvoidScale(doubled1,doubled2=1.0){Width=Width*d1;Height=Height*d2;}}Rectangler1=newRectangle();r1.Scale(1.5,3.0);r1.Scale(d2:2.0,d1:3.0);访问限制02类、字段、方法public:公共访问是类和类成员的访问修饰符。公共访问是允许的最高访问级别。对访问公共成员没有限制。private:私有访问是一个成员访问修饰符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的。protected:保护访问是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。internal:内部访问是类和类成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。使用属性、索引的示例03属性、索引使用属性button1.Textbutton1.Text=“说你好”;

含义相当于button1.SetText(“说你好”);strings=button1.Text;

含义相当于s=button1.GetText();使用属性strings=“abcde”;求出长度:s.Length

含义上相当于s.GetLength();使用索引strings=“abcde”;求出第0个字符:s[0]

含义上相当于s.Get(0)属性(property)的声明03属性、索引属性的声明语法形式:[属性集信息]opt[属性修饰符]opt类型成员名

{

访问器声明}其中:属性修饰符:属性修饰符与方法修饰符相同,包括new、static、virtual、abstract、override和四种访问修饰符的合法组合,它们遵循相同的规则。类型:指定该声明所引入的属性的类型。成员名:指定该属性的名称。访问器声明:声明属性的访问器,可以是一个get访问器或一个set访问器,或者两个都有。privatestring_name;publicstringName{get{return_name;}set{_name=value;}}在C#3以上版中可简写为publicstringName{set;get;}属性的访问03属性、索引Personp=newPerson();p.Name=“LiMing”;Console.WriteLine(p.Name);编译器产生的方法是:voidset_Name(stringvalue);stringget_Name();classPerson{privatestringmyName="N/A";privateint

myAge=0;publicstringName{get

{returnmyName;

}set

{myName=value;}

}publicint

Age{get

{returnmyAge;}set

{myAge=value;}

}publicstringInfo{get

{return"Name:"+Name+",Age:"+Age;

}

}Console.WriteLine("SimpleProperties");Personperson=newPerson();Console.WriteLine(person.Info);person.Name="Joe";person.Age=99;Console.WriteLine(person.Info);person.Age+=1;Console.WriteLine(person.Info);属性与字段03属性、索引属性是字段的自然扩展,但实际上是方法,

所以属性可以具有如下优点:可以只读或只写:只有get或set可以进行有效性检查:if…可以是计算得到的数据publicstringInfo{ get{return"Name:"+Name+",Age:"+Age;}}可以定义抽象属性(必须要在抽象类声明)索引器(Indexer)03属性、索引是C#引入的一个新型的类成员,它允许类或结构的实例按照与数组相同的方式进行索引。索引器类型于属性,它们的不同之处在于索引器的访问器采用参数。定义了索引器之后,就可以像访问数组一样,使用[]运算符访问类的成员。索引的定义[修饰符]数据类型this[数据类型标识符]{get{//获得属性的代码}set{//设置属性的代码}}索引的使用对象名[参数]编译器自动产生两个方法,以供调用Tget_Item(P);voidset_Item(P,Tvalue);//带有int参数的Photo索引器publicPhotothis[intindex]

{ get{//访问}set{}}//带有string参数的Photo索引器publicPhotothis[stringtitle]

{get

{//访问}}属性与索引03属性、索引属性索引器通过名称标识通过参数列表进行标识通过简单名称来访问通过[]运算符来访问可以用static修饰不能用static修饰属性的get访问器没有参数索引的get访问器具有与索引相同的参数列表属性的set访问器包含隐式value参数除了value参数外,索引的set访问器还具有与索引相同的参数列表继承(inheritance)04类的继承子类subclass、父类baseclass继承而得到的类为子类(subclass),被继承的类为父类、超类或基类(baseclass),父类包括所有直接或间接被继承的类,即包括直接父类及间接父类。一个父类可以同时拥有多个子类。父类实际上是所有子类的公共字段和公共方法的集合,而每一个子类则是父类的特殊化,是对字段和方法在功能、内涵方面的扩展和延伸。子类继承父类的状态和行为,同时也可以修改父类的状态或重载父类的行为,并添加新的状态和行为。采用继承的机制来组织、设计系统中的类,可以提高程序的抽象程度,使之更接近于人类的思维方式,同时也通过继承能较好地实现代码重用,可以提高程序开发效率,降低维护的工作量。C#中采用单继承C#中不支持多重继承,一个类只能有一个直接父类。C#中所有的类都是通过直接或间接地继承object(即System.Object)得到的。继承(inheritance)04类的继承图形矩形三角形椭圆形平行四边形多边形四边形圆形菱形publicclassShape{privatePoints[]points;publicdoubleGetArea(){return0;}}publicclassTriangle:Shape{}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{}继承(inheritance)04类的继承继承父类的公有/保护成员子类自动地从父类那里继承“所有”的字段、方法、属性、索引器等成员作为自己的成员增加新的成员隐藏或修改父类的成员publicclassShape{privatePoints[]points;publicdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicnewdoubleGetArea(){return2*(width+height);}}publicclassTriangle:Shape{publicdouble[]angles;}继承(inheritance)04类的继承对象生命周期继承中的构造函数和析构函数Shape::ConstructorQuadrangle::ConstructorRectangle::ConstructorShape::DestructorQuadrangle::DestructorRectangle::DestructorRectangler1=newRectangle();r1.Dispose();继承(inheritance)04类的继承base关键字base关键字用于从派生类中访问基类的成员,它主要有两种使用形式,分别如下:调用基类上已被其他方法重写的方法。指定创建派生类实例时应调用的基类构造函数。voidsayHello(){base.sayHello();Console.WriteLine("Myschoolis"+school);}Student(stringname,intage,stringschool):

base(name,age){

this.school=school;}继承(inheritance)04类的继承父类与子类的转换Personp1=newPerson();Personp2=newStudent();Students1=newStudent();Students2=newStudent();p1=s1;//可以,因为Person类型的变量可以引用Student对象s2=p1;//不行,因为会产生编译错误s2=(Student)p1;//编译时可以通过,运行时则会出现类型不能转换的异常s2=(Student)p2;//正确,因为p2引用的正好是Student对象实例as运算符as只能针对引用型变量,如果不能转换,不会引起异常,只是值为nullStudents3=p1asStudent;//结果s3为nullStudents4=p2asStudent;//s4被赋值is运算符:判断一个对象是不能某个类(及其子类)的实例

if(pisPerson)typeof()运算符:获得其运行时的类型Typet=typeof(变量);Typet=typeof(类名);同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性虚拟和重载new:覆盖基类成员publicclassShape{privatePoints[]points;publicdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicnewdoubleGetArea(){return2*(width+height);}}04类的继承多态性虚拟和重载new:覆盖基类成员virtual/override:重载基类成员publicclassShape{privatePoints[]points;publicvirtualdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}04类的继承多态性虚拟和重载new:覆盖基类成员virtual/override:重载基类成员publicclassShape{privatePoints[]points;publicvirtualdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Shapes1=newShape();doublex=s1.GetArea();Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();04类的继承多态性虚拟和重载new:覆盖基类成员virtual/override:重载基类成员publicclassShape{privatePoints[]points;publicvirtualdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverrideint

GetArea(){return2*(width+height);}}虚拟和重载方法的签名须一致!04类的继承多态性虚拟和重载new:编译时的多态性override:运行时的多态性publicclassShape{privatePoints[]points;publicvirtualdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Shapes1=newShape();doublex=s1.GetArea();Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();04类的继承多态性抽象类和抽象方法抽象类:不能创建实例publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Shapes1=newShape();doublex=s1.GetArea();Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();04类的继承多态性抽象类和抽象方法抽象类:不能创建实例抽象方法:不能有实现代码!publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea(){return0;}}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();04类的继承多态性抽象类和抽象方法抽象类:不能创建实例抽象方法:必须在派生类中override!publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea();}publicclassQuadrangle:Shape{}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();04类的继承多态性抽象类和抽象方法抽象类:不能创建实例抽象方法:必须在非派生类中override!publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea();}publicclassQuadrangle:Shape{publicoverridedoubleGetArea(){return0;}}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}Quadrangleq1=newQuadrangle();x=q1.GetArea();Rectangler1=newRectangle();x=r1.GetArea();也是virtual方法04类的继承多态性publicsealedclassQuadrangle:Shape{publicoverridedoubleGetArea(){return0;}}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}抽象类和抽象方法abstract类:要求继承sealed类:不能被继承publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea();}04类的继承多态性publicclassQuadrangle:Shape{publicsealeddoubleGetArea(){return0;}}publicclassRectangle:Quadrangle{publicdoublewidth;publicdoubleheight;publicoverridedoubleGetArea(){return2*(width+height);}}抽象类和抽象方法abstract方法:要求重载sealed方法:不能被重载publicabstractclassShape{privatePoints[]points;publicabstractdoubleGetArea();}04类的继承多态性密封类与密封方法04类的继承

为了避免滥用继承,C#中提出了密封类的概念。密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。

如果类的方法声明中包含sealed修饰符,则称该方法为密封方法。密封方法只能用于对基类的虚方法进行实现,因此,声明密封方法时,sealed修饰符总是和override修饰符同时使用。publicsealedclassJHInfo:Information//密封类{//将基类的虚方法重写,并设置为密封方法publicsealedoverridevoidShowInfo(){

Console.WriteLine("进货信息:\n"+Code+""+Name);}}基本概念05修饰符在使用类及其成员时,有时为了更好地控制类及其域、方法等元素的的存取权限,更好地表示类及其成员的特点,需要在类或其成员的定义时用到各种修饰符,如前面多次用到的public、private、new、static等等。修饰符包括访问控制符和非访问控制符。本节来介绍常见的一些修饰符。访问控制符类及其成员都有访问权限的控制,这样才能更好地实现数据和代码的“封装性”。这所以C#提供了对类成员在四种范围中的访问权限的控制,这四种范围包括:同一个类中、同一个程序集中、不同程序集中的子类、不同程序集中的非子类。C#中的访问控制符5个,其中基本的有4个:public,protected,private,internal,还有1个复合的修饰符protectedinternal(也可以写成internalprotected)。这里的protectedinternal的实际含义是“protected或者internal”,是这两者的并集。类的成员的可访问性05修饰符类的成员的可访问性有两方面的含义:一种是基于逻辑的,例如protected表示其子类也可访问;一种是基于物理的,即可访问性跟是否在同一程序集(Assembly)中有关,如internal表明在同一程序集内可访问。程序集,也称“程序装配”,是指将编译时将多个类(编译后的MSIL指令)放入到同一个文件中(一般是.dll

文件或.exe文件)类的成员(字段、方法、属性、索引等)的访问性public:含义是“无限制访问”。protectedinternal:含义是“同一程序集内或子类可访问”。protectd:含义是“同类及其子类可访问”。internal:含义是“同一程序集内可访问”。private:含义是“仅在同类中可访问”。static05修饰符static的字段、方法、属性是属于整个类的static方法中,不能访问实例变量调用static方法时,直接用类名访问Console.Write(…);Math.Sqrt(…);Convert.ToDateTime(…);DateTime.ParseString.Copy(a);String.Format(“{0}”,x)static变量可以用来表示“全局变量”在c#2.0中,类名也可以用static来修饰static构造方法classPerson{staticlongtotalNum;staticPerson(){totalNum=(long)52e8;Console.WriteLine("人类总人口"+totalNum);}}Static构造方法只会调用一次,但其调用时间是不确定的。const及readonly05修饰符const相当于静态常量如Math.PIreadonly相当于不可改量,只能赋一次值如String.Empty在构造方法中赋值,或者在声明时就赋值注:const只能用于基本类型及stringreadonly只能修饰字段,而const还可以修饰局部变量sealed及abstract05修饰符sealed类,不可继承(也有利于编译优化)如StringConsoleMathConvertGraphicsFontabstract类,不可实例化(new)如Array,RandomNumberGeneratorabstract的方法体,只需声明,而不需实现,即用分号(;)而不是用{}abstract类型方法名(参数列表);abstract类型属性名{get;set;}abstract类型this[参数列表]{get;set;}在使用abstract要注意以下几点:1)abstract不能与static并列修饰同一方法;2)abstract不能与private并列修饰同一方法,也不能省略访问控制符;3)abstract方法必须位于abstract类中;4)子类在实现一个abstract方法时,要用override修饰,否则不认为是实现了该抽象方法,而认为是一个新(new)的方法。小结05修饰符public/private/internal/protected是访问控制符static属于类的而非实例的const常量readonly只读量sealed不可继承的abstract抽象的接口(interface)06接口相似于抽象类一个抽象成员的集合如:ICloneable,IComparable,IConvertible,IDisposable,IFormattable,Ienumerable

接口提出了一种契约(或者说规范),让使用接口的程序设计人员必须严格遵守接口提出的约定。接口可以包含方法、属性、索引器和事件作为成员,但是并不能设置这些成员的具体值,也就是说,只能定义。

C#中声明接口时,使用interface关键字。修饰符interface接口名称:继承的接口列表{

接口内容;}语法接口的作用06接口帮助实现多重继承实现不相关类的相同行为,而不需要考虑这些类之间的层次关系指明多个类需要实现的方法通过接口可以了解对象的交互界面,而不需了解对象所对应的类接口的实现

定义

interfaceInformation{stringCode{get;set;} voidShowInfo();}

publicc

温馨提示

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

最新文档

评论

0/150

提交评论