C#经典入门教程详解课件.ppt_第1页
C#经典入门教程详解课件.ppt_第2页
C#经典入门教程详解课件.ppt_第3页
C#经典入门教程详解课件.ppt_第4页
C#经典入门教程详解课件.ppt_第5页
已阅读5页,还剩428页未读 继续免费阅读

下载本文档

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

文档简介

第1章C#与NET平台介绍本章目标,了解.NETFramework的结构理解.NETFramework的基本概念CLRJITCTSMSIL了解.NETFramework命名空间了解C#程序的基本结构,1C#语言的由来,在过去的二十年里,C和C+已经成为在商业软件的开发领域中使用最广泛的语言。它们为程序员提供了十分灵活的操作,不过同时也牺牲了一定的开发效率。与VB等语言相比,同等级别的C/C+应用程序往往需要更长时间来开发。由于C/C+语言的复杂性,许多程序员都试图寻找一种新的语言,希望能在功能与效率之间找到一个更为理想的权衡点。VB以牺牲灵活性的代价来提高效率。可是这些灵活性正是C/C+程序员所需要的。这些解决方案对编程人员的限制过多(如屏蔽一些底层代码控制的机制),所提供的功能难以令人满意。这些语言无法方便地同早先的系统交互,也无法很好地和当前的网络编程相结合。,对于C/C+用户来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。他们想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。另外,一些C/C+开发人员还需要在必要的时候进行一些底层的编程。C#(Csharp)是对这一问题的解决方案。C#是一种新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。,C#语言的特点:C#语言是Microsoft发布的一种全新的编程语言,是其.Net战略的一枚重要棋子。C#语言是面向对象的、现代的编程语言,用C#编写的应用程序可以充分利用.Net的框架体系带来的优点.既可以用来编写基于通用网络协议的Internet服务软件,也可以编写各种数据库、网络服务应用程序和Windows窗口界面程序。C#继承了C/C+的优点和灵活性,能够充分利用OS系统的底层功能,同时又具备了完全的面向对象特性。可以让初学者直接了解面向对象编程的各种概念,学习现代的编程思想和手段。,2.NET代码的编译语言特定的编译器和运行库,代码被执行,IL+元数据,CLR,IL和CLR的使用IntermediateLanguageCommonLanguageRuntime,编译执行.NET程序,Microsoft中间语言,MSIL+元数据,机器代码,代码被执行,CLR,MSIL,帮助语言实现互操作,IL不是字节代码,但很接近字节代码。因此,执行应用程序时,IL到机器码的转换速度非常快!,通过CLR将MSIL转换为具体CPU的代码,CPU无关的指令集,语言编译器,.NET源代码,程序集,client.exe,client.exe,clientlib.dll,client.exe,module,IL语言范例,IL_0000:nopIL_0001:callIL_0006:nopIL_0007:ldc.i4.0IL_0008:callIL_000d:nopIL_000e:ldnullIL_000f:ldftnIL_0015:newobjIL_001a:callIL_001f:nopIL_0020:newobjIL_0025:callIL_002a:nopIL_002b:newobjIL_0030:throw,通用语言运行时CLR,.NET的语言互操作性:不同语言编写的代码可互相调用C#的平台移植性:框架JIT编译器(JustInTime,即时编译器。),3.NETFramework简介,.NETFramework类似于JVM.NETFramework两个主要组件:通用语言运行时(CLR)统一的类库集.NET的类库:线程文件输入/输出(I/O)数据库支持XML解析数据结构,.NETFramework的体系结构,VisualStudio.NET,CLR通用语言运行时(CLR),BaseClassLibrary:IO,Drawing,Threading,DataandXML,XMLWebservices,WindowsForms,WebForms,通用语言规范(CLS),VB,C+,C#,JScript,操作系统,.NetFramework类库(FCL),CLS和CTS,通用语言规范CLSCommonLanguageSpecification规定所有.NET语言都应遵循的规则生成可与其他语言互操作的应用程序通用类型系统(CommonTypeSystem,CTS。)包含标准数据类型包含准则集,CLS、CTS和MSIL紧密配合以实现语言互操作性,命名空间就像在文件系统中一个文件夹容纳多个文件一样,可以看作某些类的一个容器。通过把类放入命名空间可以把相关的类组织起来,并且可以避免命名冲突。命名空间既用作程序的“内部”组织系统,也用作“外部”组织系统(一种向其他程序公开自己拥有的程序元素的方法)使用命名空间:using类似#include,4命名空间,1.HclassA,2.HclassA,3.cpp#include“1.h”#include“2.h”.,3.cppclassAclassA,namespacea1classA,namespacea2classA,3.csusinga1;usinga2;a1.Aa2.A,常用命名空间,5创建“HelloWorld”应用程序,单击“开始”“程序”“MicrosoftVisualStudio.NET2005”“MicrosoftVisualStudio.NET2005”此时将打开VS.NET2005的起始页要创建C#控制台应用程序,请从列表中选择“创建建”“项目”。此时将打开“新建项目”窗口选择“VisualC#项目”作为项目类型,选择“控制台应用程序”作为模板,C#模板,Console.WriteLine(HelloWorld);,输出,HelloWorld.csprojAssemblyInfo.csProgram.cs,“HelloWorld”应用程序文件,编译和执行C#应用程序,要生成C#项目,请从菜单中选择“生成”“生成解决方案”该过程将编译项目中包括的所有文件,编译结果显示在“输出”窗口中如果结果显示“生成:1成功或最新,0失败,0被跳过”,则说明已经成功生成,然后即可交付该应用程序,要运行刚才生成的应用程序,请从菜单中选择“调试”“开始执行(不调试)”输出结果显示在VS.NET控制台窗口中,C#应用程序文件夹结构,VisualStudio.NET2005创建一个与项目同名的文件夹,此处为“HelloWorld”该文件夹包含项目文件“HelloWorld.csproj”和其他关联文件每个新项目都创建了bin、obj和Properties三个文件夹。Bin和obj这两个文件夹下都有一个Debug子目录,其中包含可执行文件HelloWorld.exe在“解决方案资源管理器”中启用“显示所有文件”选项,可查看“HelloWorld”项目的结构,/这是用C#编写的一个简单的HelloWorld程序usingSystem;namespaceNotepadclassHelloWorldstaticvoidMain()Console.WriteLine(HelloWorld);,声明HelloWorld类,描述代码的注释,HelloWorld程序,程序入口点,Main的返回类型为void,控制台类的WriteLine()方法用于显示输出结果,导入System命名空间,声明命名空间Notepad,将文件保存为*.cs,说明:1.程序一般包括以下几部分:名称空间的引用:使用using关键字指明引用的名称空间。名称空间的声明:使用namespace关键字声明名称空间。类:使用class关键字声明类。Main方法:Main方法是C#程序的入口。2.类中包含了程序所要用到的数据和所要执行的方法的定义。每个类中可以有:(1)变量声明(2)构造函数(3)方法(4)属性(5)事件3.一个文件中可以有1个或者多个类。4.所有语句都以分号;结束。,C#语言基础,第2章,目标,在C#中定义变量和常量使用C#中的基本数据类型理解装箱和拆箱的概念使用C#中的运算符,选择结构和循环结构定义和使用数组,了解结构和枚举了解C#中的预处理指令理解C#中常用的字符串处理方法,第一个C#程序:HelloWorld,usingSystem;classHelloWorldstaticvoidMain()Console.WriteLine(“Hello,World!”);,HelloWorld.cs,第一个C#程序:HelloWorld,1:usingSystem;,第1行:,using关键字用来引用.NET框架类库中的资源通常在程序文件的开头使用如果程序中需要多种资源,可以使用多次usingSystem命名空间System命名空间提供了构建应用程序所需的系统统能的访问,第一个C#程序:HelloWorld,2:classHelloWorld3:.8:,第2,3,8行:,类在C#或其他面向对象语言中,需要编写类使用关键字class定义一个类,类的内容放在一对中示例中定义了一个名为HelloWorld的类,第一个C#程序:HelloWorld,4:staticvoidMain()5:.7:,第4,5,7行:,Main方法Main方法是应用程序的入口点,编译器将由该处开始执行程序方法体也放在一对中每个C#的应用程序都必须包含Main方法,4:staticvoidMain()5:.7:,第4,5,7行:,Main方法static表示Main方法是一个全局方法void表示Main方法没有任何返回值,即返回值是空参数放在小括号中定义。此处括号内没有内容,表明Main方法没有任何参数,第一个C#程序:HelloWorld,6:Console.WriteLine(“Hello,World!”);,第6行:,语句在C#中要执行的指令语句之间用;分隔,编译器通过分号来区分多个语句使用大括号标识某个代码块的开始和结束,从而可以对语句进行组合。大括号必须成对匹配。,第一个C#程序:HelloWorld,6:Console.WriteLine(“Hello,World!”);,第6行:,语句HelloWorld程序的主要目的就是在屏幕上显示一条问候WriteLine方法用来将问候语写到标准输出设备上。Console代表标准输出设备-屏幕,它属于System命名空间WriteLine方法是Console类的方法。访问类或对象的方法使用点取符.来完成。字符串用双引号“”表示字符串“Hello,World”是WriteLine方法的参数,表示屏幕输出的内容,第一个C#程序:HelloWorld,系统预定义类型,系统预定义类型,字面量,int:intiMax=int.MaxValue;intpVal=int.Parse(“100”);shorti16=50;inti32=i16;i16=i32;错误i16=(short)i32;decimaldecimaliRate=3.9834M;iRate=decimal.Round(iRate,2);/四舍五入iRate=decimal.Remainder(512.0M,51.0M);,boolboolbt=(bool)1;/错误charstringpattern=“123abcd?”;boolbt;bt=char.IsLetter(pattern,3);bt=char.IsNumber(pattern,3);bt=char.IsLower(pattern,3);bt=char.IsPunctuation(pattern,7);bt=char.IsLetterOrDigit(pattern,3);,single,doublefloatf=24567.66f;doubled=124.45;If(Single.IsNaN(1/0)使用Parse转换数字字符串shortshParse=Int16.Parse(100);intiParse=Int32.Parse(100);longshParse=Int64.Parse(100);decimaldParse=decimal.Parse(“99.99);floatsParse=float.Parse(“99.99);doubledParse=double.Parse(“99.99);,字符串,字符串直接量stringpath;path=”C:note.txt”;path=“C:note.txt”;字符串操作索引字符串中的单个字符stringstr=“abcd”;charc=str0;字符串连接strings1=“Myage=“;intmyAge=28;stringcat=s1+myAge;,字符串操作抽取和定位子串stringpoem=“InXanadudidKublaKhan”;stringpoemSeg=poem.Substring(10);poemSeg=poem.Substring(0,9);intindex=poem.IndexOf(“I”);index=poem.LastIndexOf(“n”);比较字符串boolisMatch;stringtitle=AncientMariner;isMatch=(title=ANCIENTAMRINER);isMatch=(title.ToUpper()=ANCIENTMARINER);isMatch=title.Equals(AncientMariner);,String常用方法,C#中常用的字符串处理方法:Equals():比较两个字符串的值是否相等ToLower():将字符串转换成小写形式IndexOf():查找某个字符在字符串中的位置SubString():从字符串中截取子字符串Join():连接字符串Split():分割字符串Trim():去掉字符串两边的空格,实例,将一文件名的扩展名改为.dat。例:1.txt改为1.dat,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011classProgramstaticvoidMain(stringargs)stringfilename=1.2.txt;intindexDot=filename.LastIndexOf(.);stringextendName=dat;filename=filename.Substring(0,indexDot+1);filename+=extendName;Console.WriteLine(filename);,String常用方法应用1,已有如下代码,按要求增加功能:,staticvoidMain(stringargs)stringemail;/电子邮件地址Console.WriteLine(请输入你的邮箱:);email=Console.ReadLine();Console.WriteLine(你的邮箱是0,email);,需实现的功能:1、输入yes时,程序循环执行2、兼容以下各种形式yes(YES、yes、YeS.)3、提取邮箱的用户名,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011classProgramstaticvoidMain(stringargs)while(1)stringemail;/电子邮件地址Console.WriteLine(请输入你的邮箱:);email=Console.ReadLine();Console.WriteLine(你的邮箱是0,email);Console.WriteLine(继续输入邮箱吗?);stringinput=Console.ReadLine();if(input.ToUpper()=YES)continue;elsebreak;,while(true),String常用方法应用2,输入一个字符串,输出每个单词,重新用下划线连接输出,使用Split()方法分割字符串使用Join()方法连接字符串,Split()方法分割字符串,代码分析,splitStrings=inputString.Split();,/将分割后的字符串使用下划线连接在一起joinString=string.Join(_,splitStrings);,返回值为字符串数组,字符串变量名,参数:分隔符(char型),返回字符串,静态方法,参数1:连接符参数2:字符串数组,关键代码:,Join()方法连接字符串,usingSystem;classProgramstaticvoidMain(stringargs)stringinputString;inputString=Console.ReadLine();inputString=inputString.Trim();stringsplitStrings=inputString.Split();stringjoinString=string.Join(_,splitStrings);Console.WriteLine(joinString);,如果字符串两边有空格?,Format()方法,两种输出字符串的方式:,stringname=李四;Console.WriteLine(Mynameis+name+,Iam+18);,stringname=李四;Console.WriteLine(Mynameis0,Iam1,name,18);,格式字符串,变量列表,String类的Format()方法用来格式化字符串,关键代码:,record=string.Format(姓名:0n出生年月:1n身高:2n血型:3n星座:4n最喜欢的食物:5,name,birthday,height,bloodType,planet,favourFood);Console.WriteLine(n这是你的个人档案:);Console.WriteLine(record);,参数与WritLine()方法相似,Format()的语法小结,stringmyString=string.Format(格式字符串,参数列表);,stringmyString=string.Format(0乘以1等于2,2,3,2*3);,格式字符串,代表,参数列表,2乘以3等于6,包括占位符x,小结,补充下划线处的占位符,输出五个成语,stringyi=一;stringer=二;stringsan=三;stringword=string.Format(独_无_,_心_意,垂涎_尺,略知_,举_反_,yi,er,san);Console.WriteLine(word);,stringyi=一;stringer=二;stringsan=三;stringword=string.Format(独0无1,2心1意,垂涎2尺,略知01,举0反2,yi,er,san);Console.WriteLine(word);,枚举,accessmodifiersenum:enum_baseenumbody,classMyAppenumFabric:intCotton=1,Silk=2,Wool=4staticvoidMain()Fabricfab=Fabric.Cotton;intfabNum=(int)fab;stringfabType=fab.ToString();Console.WriteLine(fab);,整型,默认为int,默认为internal,枚举和位标志,namespaceMyHelloAppclassmyAppFlagsenumFabricCotton=1,Silk=2staticvoidMain()Fabricfab1=(Fabric)3;Console.WriteLine(fab1.ToString();,System.Enum的方法,usingSystem;namespaceApp1classmyAppenumFabricCotton=1,Silk=2staticvoidMain()stringfabStr=Cotton;if(Enum.IsDefined(typeof(Fabric),fabStr)Fabricfab=(Fabric)Enum.Parse(typeof(Fabric),fabStr);Console.WriteLine(Enum.GetName(typeof(Fabric),2);,变量,staticvoidMain(stringargs)/声明布尔型、字符串型、整型、短整型和浮点型变量boolt=false;shortn1=30;intn2=1200;stringstr=jeny;floatn3=23.1f;/显示变量值Console.WriteLine(布尔值=+t);Console.WriteLine(短整型值=+n1);Console.WriteLine(整型值=+n2);Console.WriteLine(字符串值=+str);Console.WriteLine(浮点值=+n3);,变量中存储的值取决于该变量的类型,常量,staticvoidMain(stringargs)/PI常量PIconstfloat_pi=3.1415169F;/由地球引力引起的加速度常量,单位为cm/s*sconstfloat_gravity=980;/钟摆的长度intlength=60;/钟摆的周期doubleperiod=0;/钟摆周期的计算公式period=2*_pi*Math.Sqrt(length/_gravity);Console.WriteLine(钟摆的周期为0秒,period);,声明常量,在表达式中使用常量,const关键字用于声明常量,数组,数组是同一数据类型的一组值数组属于引用类型,因此存储在堆内存中数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行语法:数据类型,数组名称=new类型n,;intarrayHere=newint6;,数组,staticvoidMain(stringargs)intcount;Console.WriteLine(“请输入准备登机的乘客人数);count=int.Parse(Console.ReadLine();/声明一个存放姓名的字符串数组,其长度等于乘客人数stringnames=newstringcount;/用一个for循环来接受姓名for(inti=0;i0)charch=pathi1;if(ch=)break;i-;dir=path.Substring(0,i);name=path.Substring(i);staticvoidMain()stringdir,name;/变量作为输出参数无须明确赋值SplitPath(c:WindowsSystemhello.txt,outdir,outname);Console.WriteLine(dir);Console.WriteLine(name);,c:WindowsSystemhello.txt,参数数组,在不能确定需要传递多少个参数的时候可以使用params关键字指明一个可变的参数数组。数组参数的类型必须是一维数组,而且必须是形参表中的最后一个参数。数组参数始终是值传递方式进行传递,不能将params同ref和out组合。,例如,下面定义一个具有params参数的求平均值函数:publicdoubleAVG(paramsintNums)intSum=0;intCount=0;foreach(intninNums)Sum+=n;Count+=1;Nums0=100;return(Sum/Count);调用该函数时,可以采用下面的语句:Class1a=newClass1();doubled=a.AVG(13,27,33,25,78);另外,还可以传递一个实际的数组:intargs=31,41,46,53,28;doubled=a.AVG(args);args0=?,3.5属性成员,属性主要用于描述和维护类对象的状态。从客户端看,对属性的访问就好像直接访问public字段成员,但在类内部是通过类方法访问的。创建一个属性包括两步:1.声明一个字段来存储属性值2.编写一个属性声明,提供访问接口,属性的建立要使用属性声明,语法如下:访问修饰符类型名属性名getreturn字段;set私有字段=value;,publicclasscheckvalprivatestringp_PropVal;/声明一个私有变量p_PropValpublicstringstr1/声明属性str1get/返回存储在私有变量中的属性值returnp_PropVal;set/存储属性值到私有变量if(Convert.ToString(value).Length=10)p_PropVal=value;elseConsole.WriteLine(toomanywords);,可以说,属性是一种特殊的方法,但属性和方法也有不同之处,主要有:属性不必使用圆括号,但方法一定使用圆括号。属性不能制定参数,方法可以指定参数。属性不能使用void类型,方法则可以使用void类型。属性使用方法与变量相同。,属性说明,可以创建只读或只写属性,即只有get或set方法。可以创建静态属性,用static关键字。静态属性不与特定实例有关联,因此在静态属性的get和set方法内引用this是错误的。静态属性使用类名访问,并且,与静态属性相配合的私有字段也应该是静态的。,例3-7:publicclasscheckvalprivatestaticstringp_time=00:00:00;/静态私有字段publicstaticstringmytime/静态属性getreturnp_time;publicstaticstringmytime1/静态属性setp_time=value;staticvoidMain()Console.WriteLine(checkval.mytime);checkval.mytime1=10:2:22;Console.WriteLine(nowis+checkval.mytime);,输出结果为:00:00:00nowis10:2:22,3.3.6this关键字this引用的是当前实例。this关键字是一个隐含引用,它隐含于每个类的成员函数中。this关键字引用类的当前对象,成员通过this关键字可以知道自己属于哪一个实例。publicclassTest1publicstringstr;publicvoidf(stringstr)this.str=str;publicstaticvoidMain()Test1test=newTest1();test.f(aaa);静态函数没有this关键字。,将对象作为参数传递到其他方法,例如:publicclassTest1publicstringstr=aaa;publicvoidf(Test1test)str=bbb;Console.WriteLine(test.str);publicvoidf1()f(this);publicstaticvoidMain()Test1test=newTest1();test.f1();,索引器,访问修饰符数据类型this数据类型标识符get;set;,语法,参数化成员属性:包含set、get方法。与成员属性不同:它可以接受1个或多个参数使用this作为索引器的名字,定义和调用索引器,classPhotostring_title;publicPhoto(stringtitle)this._title=title;publicstringTitlegetreturn_title;,以Title属性表示照片,将照片存放于数组photos中,classAlbum/该数组用于存放照片Photophotos;publicAlbum(intcapacity)photos=newPhotocapacity;,定义和调用索引器4-2,publicPhotothisintindexget/验证索引范围if(index=photos.Length)Console.WriteLine(索引无效);/使用null指示失败returnnull;/对于有效索引,返回请求的照片returnphotosindex;setif(index=photos.Length)Console.WriteLine(索引无效);return;photosindex=value;,带有int参数的Photo索引器,读/写索引器,定义和调用索引器,publicPhotothisstringtitleget/遍历数组中的所有照片foreach(Photopinphotos)/将照片中的标题与索引器参数进行比较if(p.Title=title)returnp;Console.WriteLine(未找到);/使用null指示失败returnnull;,带有string参数的Photo索引器,只读索引器,定义和调用索引器,staticvoidMain(stringargs)/创建一个容量为3的相册Albumfamily=newAlbum(3);/创建3张照片Photofirst=newPhoto(Jeny);Photosecond=newPhoto(Smith);Photothird=newPhoto(“Lono);/向相册加载照片family0=first;family1=second;family2=third;/按索引检索PhotoobjPhoto1=family2;Console.WriteLine(objPhoto1.Title);/按名称检索PhotoobjPhoto2=family“Jeny;Console.WriteLine(objPhoto2.Title);,中级特性,面向对象技术的三个核心概念:封装:将数据和操作组合到一起,并决定哪些数据和操作对外是可见的。继承:父类中的变量和行为,子类可以同样使用。本质是代码重用。多态:由继承引出的一种机制,父类型的引用变量可以指向子类型的对象。,封装,封装把对象的所有组成部分组合在一起,有三个作用隐藏类的实现细节:使用方法将类的数据隐藏起来。迫使用户去使用一个界面去访问数据:定义程序如何引用对象的数据,控制用户对类的修改和访问数据的程度。使代码更好维护:类的内部实现改变,对外接口可以不变。,继承,继承提供了创建新类的一种方法,继承对开发者来说就是代码共享。通过继承创建的子类是作为另一个类的扩充或修正所定义的一个类。子类从超类(父类)中继承所有方法和变量。子类和超类之间是特化与范化的关系。,子类的声明,语法:子类声明:父类子类体子类可以使用父类的protected和public可见的变量和方法,就像这些变量和方法是自己定义的一样。C#中,如果类声明时没有声明父类,那么缺省为Object类的子类。C#中的所有类都是System.Object类的子类。C#中,子类只能继承一个父类。,classCarintcolor;intdoor;intspeed;voidPushBreak()publicvoidAddOil(),classTrashCar:CarclassMyAppstaticvoidMain()TrashCarmyCar=newTrashCar();myCar.AddOil();myCar.PushBreak();,派生类的建立需要注意:(1).派生类会继承基类除了构造函数和析构函数的所有成员。(2).派生类调用构造函数时,会先调用基类的构造函数。默认调用没有参数的构造函数。(3).用base关键字显式调用基类构造函数。,classCarpublicCar(inti)classTrashCar:CarpublicTrashCar(inti),classCarpublicCar(inti)classTrashCar:CarpublicTrashCar(inti):base(i),错误,错误,publicCar(),去掉base(i),(3).如果需要调用基类中的同名方法,应该使用”base.方法名”来调用。classCarpublicCar()protectedvoidf()Console.WriteLine(aaa);classTrashCar:CarpublicTrashCar()voidf()Console.WriteLine(bbb);publicvoidf1()base.f();f();classMyAppstaticvoidMain()TrashCarmyCar=newTrashCar();myCar.f1();,例3-8继承格式举例publicclassparent/建立基类publicparent(stringstr)/基类带参数构造函数Console.WriteLine(str);publicvoidshowposition()/基类方法Console.WriteLine(基类的位置在(0,0));publicclasschild:parent/派生子类publicchild():base(调用基类构造)/子类构造函数,调用基类构造函数Console.WriteLine(Iamchild);publicvoidshowposition()base.showposition();/调用基类方法Console.WriteLine(派生类的位置在(10,10));在Main()方法中执行下面的代码:parentprt=newparent(Iamaparent);childchd=newchild();prt.showposition();chd.showposition();,输出结果为:Iamaparent调用基类构造Iamchild基类的位置在(0,0)基类的位置在(0,0)派生类的位置在(10,10),例3-9:编写一个程序,计算球,圆锥,圆柱的表面积和体积usingSystem;namespaceConApp1publicclassCircleprotecteddoubleradius;publicCircle(doubler)radius=r;publicdoubleGetArea()returnMath.PI*radius*radius;publicclassSphere:Circle/球体类publicSphere(doubler):base(r)publicdoubleGetArea()return(4*base.GetArea();publicdoubleGetVolumn()return(4*Math.PI*Math.Pow(radius,3)/3);publicclassCylinder:Circle/圆柱类privatedoubleheight;/添加高度字段publicCylinder(doubler,doubleh):base(r)height=h;publicdoubleGetArea()return(2*base.GetArea()+2*Math.PI*radius*height);publicdoubleGetVolumn()return(Math.PI*radius*radius*height);,publicclassCone:Circle/圆锥类privatedoubleheight;/添加高度字段publicCone(doubler,doubleh):base(r)height=h;publicdoubleGetArea()return(Math.PI*radius*(radius+Math.Sqrt(height*height+radius*radius);publicdoubleGetVolumn()return(Math.PI*radius*radius*height/3);publicclassTesterpublicstaticvoidMain()Circlec1=newCircle(2);Spheres1=newSphere(2);Cylindercd1=newCylinder(2,10);Conecn1=newCone(2,10);Console.WriteLine(s1sserfacearea=0,volumn=1,s1.GetArea(),s1.GetVolumn();Console.WriteLine(cd1sserfacearea=0,volumn=1,cd1.GetArea(),cd1.GetVolumn();Console.WriteLine(cn1sserfacearea=0,volumn=1,cn1.GetArea(),cn1.GetVolumn();Console.ReadLine();,多态,继承机制引出多态机制某一类型的引用变量可以指向该类或者其子类的对象。由于C#中System.Object类是所有类的祖先,所以可以用Object类型的引用指向所有类型的对象。,classCarclassTrashCar:CarCarcar=newTrashCar();Objectobj=newCar();obj=newTrashCar();,3.5.2多态性多态性是指不同的对象收到相同的消息时,会产生不同动作。C#支持两种类型的多态性:(1)编译时的多态性是通过重载类实现的,系统在编译时,根据传递的参数个数、类型信息决定实现何种操作。(2)运行时的多态性是指在运行时,根据实际情况决定实现何种操作。C#中运行时的多态性通过虚函成员实现。,编译时多态-重载,重载指在同一个类中至少有两个方法用同一个名字,但有不同的参数。重载使得从外部来看,一个操作对于不同的对象有不同的处理方法。调用时,根据参数的不同来区别调用哪个方法。方法的返回类型可以相同或不同,但它不足以使返回类型变成唯一的差异。重载方法的参数表必须不同。,classCarintcolor;intdoor;intspeed;publicvoidPushBreak()speed=0;publicvoidPushBreak(ints)speed-=s;,Carcar=newCar();car.PushBreak();car.PushBreak(2);,运行时多态-动态绑定(虚函数),动态绑定就是根据对象的类型决定调用哪个方法,而不是引用的类型。类的方法使用virtual关键字修饰后就成为虚方法,包括两个步骤:(1).对于基类中要实现多态性的方法,用virtual关键字修饰。不允许再有static,abstract或override修饰符。(2).对于派生类中的同名方法(覆盖)-相同的名称、返回类型和参数表,使用override关键字修饰。不能有new、static或virtual修饰符。,多态-覆盖,C#中声明覆盖时,父类方法前加virtual关键字,表示该方法可以被覆盖;子类方法前加override,表示将方法覆盖。当用于子类的行为与父类的行为不同时,覆盖机制允许子类可以修改从父类继承来的行为。,例3-11下面的代码中,子类重写了父类的虚方法sleep()。publicclassanimal/基类publicvirtualvoidsleep()/虚方法Console.WriteLine(animalallneedsleep);publicclassfish:animal/派生类publicoverridevoidsleep()/重写虚方法Console.WriteLine(fishsleepingwitheye_open);publicclassdog:animal/派生类publicoverridevoidsleep()/重写虚方法Console.WriteLine(dogsleepingwitheye_closed);,Main()中的代码:animalan=newanimal3;an0=newanimal();an1=newfish();an2=newdog();an0.sleep();an1.sleep();an2.sleep();,输出结果:animalallneedsleepfishsleepingwitheye_opendogsleepingwitheye_closed,实现多态性的核心和实质:使用基类的引用指向派生类的对象,当程序运行时,编译器会自动确定基类对象的实际运行时类型,并根据实际类型调用正确的方法。,例3-12classGeometricObjectpublicvirtualvoiddraw()Console.WriteLine(GeometricObject!);classEllipse:GeometricObjectpublicoverridevoiddraw()Console.WriteLine(Ellipse!);publicvoidgetvecter()classCircle:Ellipsepublicoverridevoiddraw()Console.WriteLine(Circle!);publicdoubleg

温馨提示

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

评论

0/150

提交评论