Flowmaster脚本文件编写教程

上传人:马*** 文档编号:242865358 上传时间:2024-09-10 格式:PPT 页数:64 大小:763KB
返回 下载 相关 举报
Flowmaster脚本文件编写教程_第1页
第1页 / 共64页
Flowmaster脚本文件编写教程_第2页
第2页 / 共64页
Flowmaster脚本文件编写教程_第3页
第3页 / 共64页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,北京海基科技发展有限责任公司,Visual C#,概述,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,Visual Studio 2005,编程环境,Visual Studio 2005,可以用来创建,Windows,应用程序和网络应用程序,也可以用来创建网络服务,智能设备应用程序和,Office,插件,。,Visual Studio 2005,是一个提供了丰富工具的编程环境。包括,Team Test,设置、,Visual Basic,开发设置、,Visual C#,开发设置、,Visual C+,开发设置、,Visual J#,开发设置、,Web,开发设置、常规开发设置。首次运行需选择,以后每次启动都将默认为该设置。如要更改,则通过“工具,导入和导出设置”实现,。,Visual Studio,已安装的模板包括:,Windows,应用程序、类库、,Windows,控件库、控制台应用程序、空项目、类库、,Web,控件库、,Windows,服务以及,Crystal Reports,应用程序。,项目组成,1. .sln,解决方案文件,这是最顶级的解决方案文件,每个应用程序都有一个。包含了对一个或多个项目文件的引用。,2. C#,项目文件夹,包含以下内容:,.csproj,项目文件,引用一个或多个包含项目源代码以及其他内容的文件,在一个项目中,所有源代码都必须使用相同的编程语言来编写。,AssemblyInfo.cs,文件,在,Properties,文件夹下,用来添加“属性”,如作者姓名、程序编写日期等。,.cs,项目代码文件,是项目最初创建时,在“代码和文本编辑器”窗口中显示的文件。,bin,和,obj,文件夹,是在生成应用程序时创建的,其中包含了程序的可执行版本和其他一些文件。如,binDebug,下的,.exe,是编译好的程序,调试,|,开始执行时,会运行该程序,,.pdb,和,.vhost.exe,文件包含了在调试模式中运行程序时,Visual Studio,要使用的信息。,Visual Studio 2005,编程环境,使用命名空间,命名空间能为各种标识符创建一个已命名的容器。同名的两个类如果在不同的命名空间中,那么相互是不会混淆的。应该在命名空间中定义你所有的类,,Visual Studio2005,环境默认使用项目名称作为顶级命名空间。,.NET Framework,中的每个类都存在于一个命名空间中。如,,Console,类存在于,System,命名空间中。这意味着它的完全限定名称是,System.Console,。,Using,预编译指令可以用来限定即将使用的命名空间。在后续的代码中,不需要再用命名空间来显式地限定每一个名称。,Visual Studio,在每次新建项目时,都会自动添加下列语句:,using System;,using System.Collections.Generic;,using System.Text;,Visual Studio 2005,编程环境,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,命名变量,使用小写字母作为变量名的首字母。,在包含多个字母的标识符中,从第二个单词开始,每个单词都采取首字母大写的形式。,声明变量,需要在一个声明语句中声明变量的类型和名称,并以分号来终止。,一个变量必须赋值后才能 使用,否则程序是无法编译的。,“,=,”是赋值操作符,用来将右侧的值赋给左侧的变量。,使用变量,数据类型,描述,大小(位),范围,示例,int,整数,32,-2,31,到,2,31,-1,int count;,count=42;,long,长整数,64,-2,63,到,2,63,-1,long wait;,wait=42L;,float,浮点数,32,3.410,38,float away;,away=0.42F;,double,双精度浮点数,64,1.710,308,double trouble;,trouble=0.42;,decimal,货币值,128,28,个各不相同的数字,decimal coin;,coin=42M;,string,字符序列,每字符,16,不适用,string vest;,vest=“42”;,char,单字符,16,0,到,2,16,-1,char grill;,Grill=4;,bool,布尔值,8,True,或,false,bool teeth;,teeth=false;,基本数据类型,“,+,” :加法,“,-,” : 减法,“,*,”,:乘法,“,/,” :除法,“,%,”: 求余,通常不建议对不同类型的数值进行算术操作,并且计算结果的数值类型与操作数相同。,优先级,:“*” “/” “%”,的优先级高于,“+” “-”,的优先级,可以使用圆括号来覆盖优先级。,结合性:以上几种操作符均具有左结合性。,算术操作符,“,+,”,:,递增,“,-,”,:,递减,前缀和后缀,count+;/,后缀递增 生成的值是递增发生之前的,count,值,+count;/,前缀递增 生成的值是递增发生之后的,count,值,count-;/,后缀递减 生成的值是递减发生之前的,count,值,-count;/,前缀递减 生成的值是递减发生之后的,count,值,递增和递减变量,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,指定方法声明语法,方法是一个已命名的语句集。类似于,C,或,Visual Basic,等编程语言中的函数或者子程序。是一种基本的、功能强大的编程机制。,Microsoft Visual C#,方法的语法格式是:,returnType methodName ( parameterList),/,这里添加方法的主体语句,声明方法,return,语句,如果希望一个方法返回信息,就必须在方法内部 写一个,return,语句。为此,首先要写下关键字,return,,再写一个表达式(它将计算要返回的值),因此表达式的类型必须与函数指定的返回类型相同。,return,语句应该位于方法的尾部,因为它会造成方法的结束。,return,语句之后的任何语句都不会执行。,如果方法的返回类型为,void,可以先写下关键字,return,然后紧跟一个分号。,return,语句,指定方法调用语法,methodName(parameterList),此处的,methodName,应与被调用的方法名一致,而,parameterList,用于提供将由方法接收的可选信息。必须为每个参数(形参)提供一个参数值(实参),而且每个参数值都必须兼容于它对应的形参的类型。,每个方法调用中都必须包含一对圆括号,即使调用一个无参数的方法。,方法返回的值可以在能够使用该值的任何地方使用。,调用方法,1.,声明方法,int addValues (int leftHandSide, int rightHandSide),/,2.,调用方法,addValues(39,3) ;,或,int leftHandSide = 39;,int rightHandSide = 3;,addValues(leftHandSide,rightHandSide);,调用方法示例,作用域,如果一个变量能在程序中的一个特定位置使用,就说明该变量具有那个位置的作用域,也就是说,一个变量的作用域是指能够使用该变量的程序区域。作用域既作用于方法,也作用于变量。一个标识符的作用域是从声明该标识符的那个位置开始的。,运用作用域,定义作用域,如:,class Example,又如:,class Example, ,void firstMethod() void firstMethod(), ,int myVar; myVar = 42;, , ,void anotherMethod() void anotherMethod(), ,myVar = 42;/,错误,变量越界,myVar = 42;, , , int myVar=0;,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,bool,变量,bool,变量只能容纳两个值之一:,true,或者,false,如:,bool areYouReady;,areYouReady = true;,Console.WriteLine(areYouReady);/,输出,True,声明,bool,变量,布尔操作符,关系操作符,逻辑操作符,布尔操作符,操作符,含义,示例,结果(假定,age=42,),=,等于,age = 100,false,!=,不等于,age!=0,true,操作符,含义,示例,结果(假定,age=42,),小于,age21,false,=,小于或等于,age,大于,age16,true,=,大于或等于,age=30,true,操作符,含义,示例,结果,&,逻辑与,true&false,false,|,逻辑或,true|false,true,如果想根据一个布尔表达式的结果选择执行两个不同的代码块,就可以使用语句。,理解,if,语句的语法,if,语句的语法格式如下:,if(booleanExpression) /,此处,if,表达式必须是布尔表达式,或者是一个布尔变量,statement-1;,else,statement-2;,例:,int seconds = 0;,int minutes = 0;,if (seconds =59),seconds = 0;,minutes+;,else,seconds+;,if,语句,if (day=0 ),dayName=“Sunday”;,else if (day=1),dayName=“Monday”;,else if (day=2),dayName=“Tuesday”;,else if (day=3),dayName=“Wednesday”;,else if (day=4),dayName=“Thursday”;,else if (day=5),dayName=“Friday”;,else if (day=6),dayName=“Saturday”;,else,dayName=“unknown”;,嵌套,if,语句,使用,switch,语句,理解,switch,语句的语法,switch,语句的语法如下:,switch (controllingExpression) /,只能针对基本数据类型使用,switch,case constantExpression: /,必须是常量表达式,而不能是计算值,statements;,break;,case constantExpression:/case,标签之间如果没有额外代码,则下面的,statements;/,的代码会贯穿两个,case,break;/break,语句是用来阻止贯穿最常见的方式,default:,statements;,break;,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,使用复合赋值,复合赋值操作符,复合赋值操作符,含义,variable*=number;,variable = variable*number;,variable/=number;,variable = variable/number;,variable%=number;,variable = variable%number;,variable+=number;,variable = variable+number;,variable-=number;,variable = variable-number;,复合赋值操作符与简单赋值操作符具有一样的优先级和右结合性。,使用,while,语句,while,语句语法,while (booleanExpression),statement;,表达式必须是一个布尔表达式。,布尔表达式必须放在圆括号内。,假如首次求值时,布尔表达式为,false,,语句不会执行。,假如想要在一个,while,的控制下执行两个或者更多的语句,必须使用大括号 将语句分组到一个块中。,例:,int i = 0;/initialization,while (i!=10)/BooleanExpression,Console.WriteLine(i);/Statement,i+;/update control variable,i,被称作哨兵变量,使用,for,语句,for,语句语法,for (initialization; Boolean expression; update control variable),statement;,for,语句的三个部分都可以省略,但两个分号不能省略,如果省略布尔表达,式,那么就默认为,true,,,for,语句会永远进行下去。,例:,for (int i=0,j=10; i=j; i+,j-),Console.WriteLine(i);,使用,do,语句,do,语句语法,对于,while,和,for,语句,主体语句计算之前会最先计算,bool,表达式的值,如结果为,false,,那主体语句一次都不会运行。而,do,语句不同,在赋初值之后,首先运行主体语句,之后再求解,bool,表达式的值,如果结果为,false,,那么将不再运行主体语句,但主体至少已经执行了一次。,其语法结构为:,do,statement;,while(booleanExpression);,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,类,类,程序中的信息需要分类,而设计一个类就是将相关信息放到一个有意义的实体中的过程。一个类容纳的信息存储在字段中,类要提供的功能则用方法来实现。,封装,使用一个类的程序不应关心类的内部实际如何工作。程序只需创建类的一个实例,然后调用类的方法,而不必关心他们具体是如何实现的。,定义并使用类,定义类型,class Circle,double Area()/,类中的方法,return 3.141592*radius*radius;,double radius;/,类中的变量称为“字段”,使用类型,circle c,;,/,创建一个,circle,变量,c = new Circle();/,初始化变量,封装,控制可访问性,使用,public,和,private,关键字,将方法和数据封装在一个类的内部之后,类就成为与外界隔绝的一个孤岛。类内定义的方法和字段只有在类内才可以被看见,而外界是看不到它们的。我们虽然可以在程序中创建类的对象,但不能访问该类的字段,也不都能调用它的方法。因此,该类目前没有多大用处。然而,可以使用,public,和,private,关键字来修改字段或方法的定义,决定它们是否能从外部访问:,一个方法或字段假如只允许从类的内部访问,就说它是私有的。为了声明一个,private,方法或字段,只需在它的声明之前加,private,关键字。,一个方法或字段假如既能从类的内部访问,也能从外部访问,就说它是公共的。为了声明一个,public,方法或字段,只需在它的声明之前添加,public,关键字。,控制可访问性,例:,class Circle,public double Area(),return 3.141592*radius*radius;,private double radius;/,如果不加,private,,则默认该字段是“私有的”,使用构造函数,构造函数,使用,new,关键字来创建一个对象时,公共语言运行库必须使用那个类的定义来构造对象,并调用构造函数来执行任何必要的初始化。简言之,构造函数用来初始化对象。构造函数(,constructor,)是一种特殊的方法;它与类同名,能获取参数,但不能返回任何值。例:,class Circle,public Circle()/,默认构造函数,this.radius=0.0;,public Circle(double initialRadius)/,重载的构造函数,this.radius=initialRadius;,public double Area(),return 3.141592*radius*radius;,private double radius;,使用构造函数,构造函数被标记为,public,。如果构造函数是,private,的,它就不能在类的外部使用,造成无法从类的外部创建对象。,现在,类已经能正常使用,,Circle c;,c = new Circle();,double areaOfCircle = c.Area();/,此处用圆点表示在,c,对象上调用,Area,方法,此处,如果在新建对象圆括号中没有给定字段的值,那么将使用默认构造函数,如果该括号中给定字段值,那么将使用重载构造函数。,(参考,Visual Csharp Step by StepChapter 7Classes,),理解,static,方法,static,是定义一个方法或字段为静态方法和静态变量的关键字,该方法不必创建类的对象就可以使用了,一般通过类名来使用,没加,static,的方法则为实例方法,调用时是需要创建对象的,不可通过类名来直接使用。,在,C#,中,所有方法都必须在一个类的内部声明,然而,如果使用,static,标识符来声明一个方法或字段,就可以使用类名来调用方法或访问字段,而不需要先创建类的一个实例。下面展示了真正的,Math,类的,Sqrt,方法是如何声明的:,class Math,public static double Sqrt (double d),那么在实际应用中,如果要调用,Sqrt,方法,就可以直接输入,Math.Sqrt(),,而不必先创建一个实例,Math a;a=new Math(); double d=a.Sqrt();,这样就太麻烦了。,(参考,Visual Csharp Step by StepChapter 7Classes_static,),Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,值和引用,值类型,所有的基本数据类型都称为值类型。当你声明一个,int,变量时,编译器将生成代码来分配足以容纳一个整数的一个内存块。所有值类型都是在堆栈上创建的。,引用类型,声明引用类型的变量时,编译器不会生成代码来分配足以容纳整个变量的内存块,它只会分配一小片内存,其中刚好可以容纳包含该变量的另一个内存块的地址(或者对那个内存块的一个引用)。所有引用类型都是在堆上创建的。,总之,如果某方法调用的是一个值类型(如,int,)的变量,那么在方法执行后,输出该变量至控制台,显示值仍为方法执行前的状态,因为方法调用的仅仅是该变量的一个副本,而不是对原始变量进行操作。,如果某方法调用的是一个引用类型(如类类型)的变量,该变量作为参数传给该方法。那么在该方法中,对对象的内容进行的任何修改都会在方法完成之后通过该变量反映出来。,(,参考,Visual Csharp Step by StepChapter 8Parameters,),使用,ref,和,out,参数,创建,ref,参数,如果为一个参数(形参)附加了,ref,关键字作为前缀,那么参数就会成为实参的一个别名,而不再是实参的一个副本。使用,ref,参数时,向参数应用的任何操作,都会同样应用于实参。要创建,ref,参数,方法圆括号中的实参(,argument,)与形参(,parameter,)之前都需要加前缀,ref,。,(,适用于调用方法时赋初值,),创建,out,参数,调用方法之前,参数应该被初始化,否则将不能编译。如果希望由方法本身来初始化参数,而传递给方法的只是一个未初始化的实参,可以通过,out,关键字来实现。关键字与,ref,关键字非常相似。你可以为一个参数附加,out,前缀,使参数成为实参的一个别名。在向方法传递一个,out,参数后,必须在方法内部对其进行赋值。(适用于调用方法时未赋初值,但在定义方法时赋初值。),(,参考,Visual Csharp Step by StepChapter 8Parameters,),System.Object,类,所有类都是,System.Object,的一个特殊化类型,可以使用,System.Object,来,创建一个能引用任何引用类型的变量。等价于,object,关键字。,装箱,将一个数据项从堆栈自动复制到堆的行为称为装箱。,如,: int i = 42;,object o = i;,object,类型的变量引用值类型,由于值类型存在于堆栈,这里,o,直接引用,i,那么引用的将是堆栈,然而,,所有引用都应该引用内存堆上的对象,。所以实际情况是首先从内存堆上划分出一小片内存,然后,i,中的一个副本将存储到这片内存中,最后让,o,中的引用指向这个副本。,拆箱,从已装箱的变量中提取值的过程称为拆箱。,如,: int i = 42;,object o = i;/,装箱,i= (int)o;/,拆箱,为了访问已装箱的值,需要强制类型转换。,拆箱时指定的类型必须与装箱的类型完全一致。,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,使用枚举,声明枚举,enum season Spring=2, Summer, Fall, Winter,enum,是关键字,season,是枚举类型的名称,它的值限于几个符号名称,这些符号需要用大括号来界定,中间用逗号隔开。一个枚举为每个元素都关联了一个整数值。默认情况下,编号从,0,开始,它代表第一个元素,以后每个元素都递增了,1,。,使用枚举,枚举类型是一种值类型。声明了一个枚举类型的变量,只有在赋值之后才能使用。如:,Season colorful = Season.Fall;/,以枚举类型作为前缀,对直接量限定,Console.WriteLine(colorful);/,输出“,Fall,”,Console.WriteLine(int)colorful);/,输出“,4,”,使用结构类型,类定义的是一种引用类型,它总是在堆上创建的。某些时候,类中只包含极少的数据,因为管理堆儿造成的开销显得不合算。在这种情况下,更好的做法是将类型定义成一个结构。由于结构是在堆栈上存储的,所以能有效地减少内存管理开销。,常用结构类型,在以前的练习中,已经大量地运用了结构。在,C#,中,基本数值类型,int,,,long,,,float,分别是,System.Int32,,,System.Int64,和,System.Single,这三种结构类型的别名。此外,我们所熟悉的,bool,,,byte,,,double,,,short,等类型都是结构类型。而,object,,,string, char,等都是类类型。,声明结构类型,和类一样,结构可以包含它自己的字段、方法和构造函数,区别在于,结构是值类型,类是引用类型。,Struct Time,public Time(int hh, int mm, int ss),hours = hh%24;,minutes = mm%60;,seconds = ss%60;,public int Hours(),return hours;,private int hours, minutes, seconds;,(,参考,Visual Csharp Step by StepChapter 9StructsAndEnums),结构和类的区别,问题,结构,类,是值类型还是引用类型?,值类型,引用类型,它们的实例是存在于堆栈上还是堆上?,结构的实例称为值,存在于堆栈上,类的实例称为对象,存在于堆上,可以声明一个默认构造函数吗?,不可以,可以,如果声明自己的构造函数,编译器仍然会生成默认构造函数吗?,会,不会,如果在自己的构造函数中不初始化一个字段,编译器会帮你初始化吗?,不会,必须显式地初始化一个结构的所有字段,会,可以在声明一个实例字段的同时初始化它吗,?,不可以,只能在所有构造函数中初始化所有字段,可以,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,数组,数组是没有排序的一个元素序列。数组中的所有元素都具有相同的类型。,声明数组变量,为了声明一个数组变量,首先需要写上它所包含的元素的类型名称(不仅基本数据类型能作为数组元素,结构、枚举、类等类型的数据也可以作为数组的元素),后跟一对方括号,最后写上变量名称(最好是复数形式)。,如:,int pins;,创建数组实例,数组是引用类型,为了创建一个数组实例,首先需要写上,new,关键字,然后写上元素类型的名称,然后在方括号中添加要创建的数组的大小。,如:,pins = new int4;,使用数组变量,初始化数组变量,创建一个数组实例时,所有的元素都被初始化为一个默认值(,0,,,false, null,等),如果希望将数组元素初始化为你希望的值,需要加一对大括号来实现。,如:,int pins = new int49,3,7,2;,Time schedule = Time(12,30), Time(5,20) ;/,元素类型为结构类型,Time,访问单独的数组元素,为了访问一个单独的数组元素,你必须提供一个索引来表示自己请求的是哪一个元素。,如:,int myPin;,myPin = Pins2;/,索引值,2,访问的是数组的第三个元素,类似地,可以向一个索引元素赋值,从而更改数组的内容:,myPin = 1645;,pins2 = myPin;,集合类,.Net Framework,提供了几个类,它们能够通过其他特殊方式来收集元素。,这些类称为集合类,它们位于,System.Collections,命名空间中。,基本的集合类能够以对象的形式接受、容纳并返回它们的元素。也就是说集合类的元素类型是,object,。这意味着在集合中插入一个值时,它总是会进行装箱,从集合中移除一个值时,则必须进行一次强制类型转换,从而对它进行拆箱。,几种常用的集合类以及它们引用的方法:,ArrayList,类:主要用于对一个数组中的元素进行各种处理。可以使用,Remove,方法从,ArrayList,中移除一个元素,可以使用,Add,方法在,ArrayList,末尾添加一个元素,可以使用,Insert,方法在,ArrayList,中插入一个元素,等等。,Queue,类:实现了一个先入先出的机制。元素将在队列的尾部插入(,Enqueue,入队操作),并从队列的头部移除(,Dequeue,出队操作)。,Stack,类:实现了一个后入先出的机制。元素将在堆顶部进入堆栈,(Push,入栈操作,),,也从顶部离开堆栈(,Pop,出栈操作)。,Hashtable,类:如果我们要访问数组中的某个元素,可以通过索引来实现,而,Hashtable,类在内部维护者两个,object,数组,一个容纳作为映射来源的,key,,一个容纳作为映射目标的,value,。,SortedList,类:与,Hashtable,类非常相似,两者都允许将,key,跟,value,关联起来,只是,,SortedList,中,,keys,数组总是排好序的。,比较数组与集合,数组要声明它容纳的元素的类型,而集合不声明。这是由于集合以,object,形式来存储它们的元素的。,一个数组实例具有固定的大小,不能伸缩,而集合可根据需要动态改变大小。,数组时一种可读,/,可写数据结构,没有办法创建一个只读数组。然而,可以使,用由集合类提供的,ReadOnly,方法,以只读方式来使用集合。该方法将返回一个集,合的只读版本。,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,使用继承,继承,在程序设计中,继承纯粹是为了分类服务的,它是类之间的一种关系。如人类与哺乳动物类就可以声明一个继承关系,即人类继承于哺乳动物,与此同时,鲸类也属于哺乳动物类,那么鲸类也可以 声明为哺乳动物类的一个继承。人类与鲸类都有着哺乳动物的一切属性,但又各自保留了特有的属性。,使用继承,为了声明一个类是从另一个类继承的,需要使用以下语法:,class DerivedClass : BaseClass,这意味着派生类,DerivedClass,将从基类,BaseClass,继承,在,C#,中,,System.Object,类是所有类的根。所有类都隐式地派生于,System.Object,类,而所有类都自动继承了,System.Object,类的所有特性,包括像,ToString,这样的方法。,调用基类构造函数,一个派生类会自动包含来自基类的所有字段。创建对象时,需要对这些字,段初始化。因此,派生类的构造函数必须调用它的基类的构造函数,通过关键,字,base,来调用。,如:,class IdentifierToken : Token,public IdentifierToken(string name),:base(name)/,此处调用的是基类的重载构造函数,若不, /,加此处代码,则调用的是默认构造函数,virtual,方法,本来就用于被覆盖的方法称为,virtual,方法。覆盖方法的目的是提供同一个方法的不同实现。,例如,,ToString,方法作为,System.Object,的一个成员,用来将一个对象转换成它的字符串形式,那它怎样将一个派生类转换成字符串呢?派生类可能包含任意数量的字段。实际上,,ToString,能做的是将一个对象转换成代表其类型的一个字符串。而这种转换没有多大用途。,System.Object,中的,ToString,方法是像下面这样定义的:,namespace System,class Object,public virtual string ToString(),override,方法,假如基类将一个方法声明为,virtual,方法,派生类就可以使用,override,关键字来声明该方法的另一个实现。,不允许使用,virtual,或,override,关键字来声明一个,private,方法,否则会得到一个编译时错误。,两个方法必须完全一致,也就是说,它们必须具有相同的名称、相同的参数类型以及相同的返回类型。,两个方法必须有相同的可访问性。假如其中一个方法是,public,的,那么另一个也必须是,public,的。,只能覆盖一个,virtual,方法,假如基类方法不是,virtual,的,那么覆盖就不能实现。而,C#,中的方法默认都不是,virtual,的。,假如派生类不用,override,关键字来声明方法,就不会覆盖基类方法。换言之,它会成为完全不同的一个方法的实现,只是恰巧与基类方法同名。,一个,override,方法将隐式地成为,virtual,方法,它本身可在未来的一个派生类中被覆盖。,Protected,访问,public,和,private,关键字代表着两种极端的可访问性:一个类的,public,字段和方法可由所有人访问,而一个类的,private,字段和方法只能由类本身来访问。,如果需要让一个基类允许派生类访问它的部分成员,同时,在不属于层次结构,即没有继承关系的类面前隐藏这些成员,在这种情况下,可以用,protected,关键字来标记成员:,派生类可以访问一个,protected,基类成员。也就是说,在派生类中,一个,protected,基类成员相当于,public,成员。,如果类不是一个派生类,就不能访问,protected,的类成员。也就是说,在不是派生类的一个类中,一个,protected,的类成员相当于,private,成员。,创建接口,接口允许将一个方法的名称和它的实现彻底隔绝。接口提供了一个规范,只指出方法的名称、返回类型和参数。方法具体是如何实现的,是从继承接口的类中规定的。,接口语法,为了声明一个接口,需要使用,interface,关键字,interface Icomparable/,接口名以大写字母,I,开头,int ComareTo(object obj);/,方法主体替换成一个分号,不允许接口中包含任何字段;,不允许在接口中包含任何构造函数;,不允许提供一个访问修饰符,接口中的所有方法都隐式地是,public,方法;,不允许在接口中嵌套任何类型(,enum, struct, class,interface,或,delegate,);,不允许从,struct,或者,class,中继承一个接口。,实现接口,为了实现一个接口,需要声明一个,class,或者,struct,,让它们从接口继承,然后实现所有接口方法。,如:要实现,Icomparable,中的方法,可以通过类来实现,,class Comparable :,IComparable,int Icomparable.CompareTo(object obj)/,显式地实现接口的方法,方法和返回类型完全匹配;,任何参数完全匹配;,使用接口名作为方法名的前缀,这称为显式接口实现;,方法不应该有一个访问修饰符,用于实现一个接口的所有方法都具有,public,可访问性。,抽象类与密封类,抽象类,接口可以由多个不同的类来实现,通常需要让派生类的一部分共享通用的实现。例如,同时实现某接口的几个类中的构造函数代码出现重复,那么将出现警告,如果我们新建一个类,该类重构了通用构造函数,然后让所有类从该类继承,这样就可以实现通用。那我们新建的这个类的唯一目的就是让别的类从它继承,它是对通用功能的一个抽象,它本身作为一个实体没有多大意义,我们将它成为抽象类。,为了明确声明不允许创建某个类的实例,必须将那个类显示地声明为抽象类,关键字用,abstract,。,密封类,如果要防止一个类被用作基类,可以用关键字,sealed,来实现。,如:,sealed class LiteralToken : DefaultTokenImpl, Itoken,Visual Studio 2005,环境,使用变量、操作符和表达式,方法和作用域,使用决策语句,使用复合赋值和循环语句,类和对象,值和引用,枚举和结构,数组和集合,使用继承,实现属性,Visual C#,概述,什么是属性,属性(,Property,)是逻辑字段和物理方法的一个交集。属性的声明如下:,public int X,/AccessModifier Type PropertyName,get,return this.x; /,取值代码,读取属性,set,this.x = rangeCheckedX(value);/,赋值代码,写入属性,/,所有,set accessor,都使用一个名为,value,的隐藏参数来传递要写,/,入的数据,也可以将属性为,static,,那么属性则是使用类或者结构的名称来访问的,而不是使用类或者结构的一个实例。,理解属性的局限性,不能使用,set accessor,(赋值代码)来初始化一个,struct,或者,class,的属性。如下列代码是非法的,因为,location,变量没有使用,new,来初始化。,ScreenPosition location;,location.X = 40;/,编译时错误,,location,尚未赋值,不能将属性作为一个,ref,或者,out,参数来使用;但可以将一个可写的字段作为,ref,或,out,参数来使用。,一个属性中,最多只能包含一个,get accessor,和衣个,set accessor,。属性不能包含其他方法、字段或属性。,get,和,set accessor,不能获取任何参数。所赋的值会使用,value,变量,自动传给,set accessor,。,声明接口的属性,接口也可以指定属性。为此,需要声明,get,或,set,关键字,或者同时声明这两个关键字 。但要将,get,或,set accessor,的主体换成一个分号,例如:,interface IScreenPosition,int X get; set;,int Y get; set;,那么实现这个接口的任何类或,struct,都必须实现 两个,accessor,。如:,struct ScreenPosition : IScreenPosition,public int X/,也可以选择使用一个显示接口实现语法来实现一个属性,属性的显式实现是, /,非,public,的。如,int IScreenPosition.X,get,set,public int Y,get,set,谢谢!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!