《C#程序设计课件》(资料全集)c#.ppt

上传人:max****ui 文档编号:11802028 上传时间:2020-05-03 格式:PPT 页数:55 大小:329KB
返回 下载 相关 举报
《C#程序设计课件》(资料全集)c#.ppt_第1页
第1页 / 共55页
《C#程序设计课件》(资料全集)c#.ppt_第2页
第2页 / 共55页
《C#程序设计课件》(资料全集)c#.ppt_第3页
第3页 / 共55页
点击查看更多>>
资源描述
第六章面向对象程序设计,C#.net程序设计,本章主要内容,对象、类和结构方法,方法的参数(值类型,引用类型,参数数组params)静态类与静态成员属性与索引器继承(多态性,new,Virtual和Override关键字),接口继承abstract抽象类和类成员和sealed密封类和类成员重载运算符使用VisualStudio类关系图可视化创建对象,对象、类和结构概述,对象、类和结构具有以下特点:新数据类型是使用类和结构定义的。对象是给定数据类型(类和结构)的实例。在执行应用程序时,数据类型为创建对象(或实例化)提供蓝图。C#应用程序始终包含至少一个类。结构可视为轻量类,是创建用于存储少量数据的数据类型的理想选择,不能通过继承进行扩展的类型。类支持继承,这意味着它们可以从先前定义的类中派生。典型的C#应用程序由自定义的类和.NET框架的类组成。类是C#中功能最为强大的数据类型。类定义了数据类型的数据和行为。,对象、类和结构,结构(struct),结构与类一样都具有表示其数据和行为的成员。这些成员包括:字段,属性,方法,事件,运算符,索引器,构造函数,析构函数和嵌套类型。结构与类共享几乎所有相同的语法,但结构比类受到的限制更多。结构有以下特点:结构是值类型,而类是引用类型。如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。结构不能声明默认构造函数(没有参数的构造函数)或析构函数。与类不同,结构的实例化可以不使用new运算符。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自System.ValueType,后者继承自System.Object。结构可以实现接口。由于结构不使用引用,因此结构没有标识,具有相同数据的两个值类型实例是无法区分的。,对象、类和结构,对象,对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的方法。对象具有以下特点:C#中使用的全都是对象,包括Windows窗体和控件。对象是实例化的;也就是说,对象是从类和结构所定义的模板中创建的。对象使用属性获取和更改它们所包含的信息。对象通常具有允许它们执行操作的方法和事件。VisualStudio提供了操作对象的工具:使用“属性”窗口可以更改对象(如Windows窗体)的属性。使用对象浏览器可以检查对象的内容。所有C#对象都继承自object。,对象、类和结构,类声明,类是使用class关键字来定义的,类声明语句定义一个新类,其语法格式为:特征修饰符class类名:基类名和任何实现接口的列表类体类的主要修饰符有以下几种之一。public表示不限制对该类的访问protected表示只能从所在类和所在类派生的子类进行访问private只有其所在类才能访问abstract抽象类不允许建立类的实例internal只有在同一程序集(.exe或.dll)的文件中的类型或成员才可访问的partial表示将类的定义拆分到两个或多个源文件中默认情况下,在命名空间中或在编译单元顶部(例如,不在命名空间、类或结构中)声明的任何类型都是internal。下面是声明类Shape的代码:,对象、类和结构,abstractclassShape/抽象基类,不可实例化publicconstdoublepi=System.Math.PI;/常量protecteddoublex,y;/受保护,可继承变量publicShape()/默认构造函数x=y=0;publicShape(doublex,doubley)/带参数构造函数this.x=x;this.y=y;publicabstractdoubleArea();/抽象方法,需重载在该例中abstractclassShape类定义使用了修饰符abstract,这表示该类是抽象基类,不可实例化。类的名称位于class关键字的后面,就是Shape。Shape类定义的其余部分是类的主体,用于定义行为和数据。类的字段、属性、方法和事件统称为“类成员”。,分部类定义,可以将类、结构或接口的定义拆分到两个或多个源文件中。每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来。拆分类定义,使用partial关键字修饰符,partial修饰符只能出现在紧靠关键字class、struct或interface前面的位置。如下例所示。VisualStudio在创建Windows窗体使用此分部定义方法,例如:下面在form1.cs和Form1.Designer.cs代码文件中使用分部定义共同定义类Form1。其中Form1.Designer.cs是窗体设计器自动生成的源代码,而form1.cs是手工编程代码的文件。publicpartialclassForm1:Form/form1.cs文件partialclassForm1/Form1.Designer.cs,对象、类和结构,类继承定义,继承是类的重要特性。类可以从其他类中继承。在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。例如定义一个继承了Shape类的Ellipse类:classEllipse:ShapepublicEllipse(doublex,doubley):base(x,y)/使用基类Shape的构造函数publicoverridedoubleArea()/函数重载returnpi*x*y;使用继承定义的类称为用派生类,派生类的成员包括基类的所有非私有数据和行为以及派生类为自己定义的其他数据或行为。派生类将无法继承基类私有的成员。例如:派生类Ellipse继承基类Shape的公有的常量pi和受保护的字段x,y。,对象、类和结构,字段,类的字段存储类要满足其设计所需要的数据。声明字段时可以使用赋值运算符为字段指定一个初始值。字段恰好在创建对象实例调用构造函数之前初始化。字段初始值设定项不能引用其他实例字段。字段可标记为public、private、protected、internal。这些修饰符定义类的使用者访问字段的方式。可以选择将字段声明为static静态,这使得在没有创建实例能调用静态字段。常数被声明为字段,声明时在字段的类型前面使用const关键字。常数必须在声明时初始化。例如:publicconstdoublepi=System.Math.PI;只读字段将字段声明为readonly。只读字段只能在初始化期间或在构造函数中赋值。为了简单起见,下面示例使用public字段,这样可以直接获取或设置字段值,但是不建议这样做。字段通常应为private。外部类应当通过方法、属性或索引器来间接访问字段。例如:,对象、类和结构,字段,publicclassPointpublicdoublex,y;/声明字段publicdoublez=0;/声明字段具有初始值。publicreadonlystringname=Point;/声明具有初始值只读字段。publicPoint(doublex,doubley)/构造函数用于初始化字段。this.x=x;this.y=y;name=string.Format(0(1,2,3),name,x,y,z);publicPoint():this(0,0)/调用其他构造函数,对象、类和结构,构造函数,构造函数是在创建给定类型的对象时执行的类的方法。构造函数具有与类或结构相同的名称,它通常用于初始化新对象的数据成员。只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。在上面的示例中,定义了一个具有一个简单的构造函数名为Point的类。类定义对象的类型,但它不是对象本身。对象是基于类的具体实体,有时称为类的实例。通过使用new关键字,后跟类的构造函数,可以创建对象,在为新对象分配内存之后,new运算符立即调用构造函数。下面的TestPoint类Main()中使用new运算符创建对象来实例化Point类:classTestPointstaticvoidMain()Pointp=newPoint(1.0,3.0);/创建Point对象实例pp.z=1;/Point对象实例p的z字段赋值Console.WriteLine(x,y,z)=0,1,2,3,p.x,p.y,p.z,p.name);,对象、类和结构,构造函数,不带参数的构造函数称为“默认构造函数”。当类没有构造函数,系统自动生成一个构造函数,并且将用默认值来初始化对象字段,有关默认值参见表2.1。构造函数可以使用this关键字调用同一类中的另一构造函数。如publicPoint():this(0,0)/调用其他构造函数基类的构造函数将在其派生类构造函数调用前调用,使用:base(x,y)表示调用基类的构造函数。在前面示例中,抽象基类Shape的构造函数在执行派生类Ellipse构造函数块之前被调用,使用:base(x,y)表示调用基类Shape的构造函数。publicEllipse(doublex,doubley):base(x,y)/使用基类Shape的构造函数在派生类中,如果不使用base关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。这意味着下面的构造函数隐式调用基类Shape默认构造函数:publicEllipse(doublex,doubley)/隐式调用基类Shape的构造函数:base()如果基类没有提供默认构造函数,派生类必须使用base显式调用基构造函数。如没有默认构造函数,前面不使用base关键字的派生类构造函数将无法编译。,对象、类和结构,析构函数,在类的实例超出范围时,类的实例将会自动执行析构函数。例如:Shape()/析构函数,对象销毁时的清除语句.Console.WriteLine(调用Shape析构函数(0,1),x,y);Ellipse()/析构函数Console.WriteLine(调用Ellipse析构函数(0,1,Area2:f),x,y,Area();析构函数特点:一个类只能有一个析构函数。无法继承或重载析构函数。无法调用析构函数。它们是被自动调用的。析构函数既没有修饰符,也没有参数。可以通过调用GC.Collect()强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。调用对象结束将按照从派生程度最大的到派生程度最小的次序调用析构函数。,对象、类和结构,方法声明,方法是包含一系列语句的代码块,是类或结构中用于执行计算或其它行为的成员。在C#中,每个执行指令都是在方法中完成的。方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称以及任何方法参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。方法的声明格式:特征修饰符方法名称(形式化参数表)方法体方法的修饰符可以是(public,protected,internal,private,static,abstract,virtual,override等)及其组合。例如下面例子的Area方法:Shape类:publicabstractdoubleArea();/抽象方法,需要在派生类重载该方法Ellipse类:publicoverridedoubleArea()/派生类重载基类抽象,方法,方法的参数,C#中方法的参数有以下两种类型:值传递类型参数:不含任何修饰符。如:voidSquareIt(intx)引用传递类型参数:以ref或out修饰符声明。如:voidSquareIt(refintx)方法值传递类型参数意味着向方法传递变量的一个副本。方法内发生的参数更改对该变量中存储的原始数据无任何影响。而引用传递类型参数意味所调用的方法可更改参数的原始数据值。向方法传递结构和类引用之间的区别:向方法传递结构时,传递的是该结构的副本,而在传递类实例时,传递的是一个引用。传递类型参数修饰符out与ref的区别在于:传递到ref的参数必须先初始化。而out的参数在传递之前不需要显式初始化。值传递有以下两种类型:值传递值类型,如:voidSquareIt(intx)参数intx是值类型。值传递引用类型,如:voidChange(intpArray)数组pArray为引用类型。引用传递有以下两种类型:引用传递值类型,如:voidSquareIt(refintx)引用传递引用类型,如:voidChange(refintpArray),方法,值传递值类型参数示例(ParamSample项目代码):classPassingValByValstaticvoidSquareIt(intx)x*=x;System.Console.WriteLine(SquareIt方法内的n值:0,x);staticvoidMain()intn=5;System.Console.WriteLine(调用SquareIt方法前的n值:0,n);SquareIt(n);/通过值来传递值System.Console.WriteLine(调用SquareIt方法后的n值:0,n);该程序运行输出:调用SquareIt方法前的n值:5SquareIt方法内的n值:25调用SquareIt方法后的n值:5在这例子里,变量n为值类型,包含数据(值为5)。当调用SquareIt时,n的内容被复制到参数x中,在方法内将该参数求平方。但在Main中,n的值在调用SquareIt方法前后是相同的。实际上,方法内发生的更改只影响局部变量x。,值传递引用类型例子:classPassingRefByValstaticvoidChange(intpArray)pArray0=888;/将pArray的第一个元素赋值为888,改变arr0pArray=newint5-3,-1,-2,-3,-4;/引用新的数组,不改变arrSystem.Console.WriteLine(方法内的数组第一元素:0,pArray0);staticvoidMain()intarr=1,4,5;System.Console.WriteLine(调用方法前的数组第一元素:0,arr0);Change(arr);System.Console.WriteLine(调用方法后的数组第一元素:0,arr0);在上个示例中,数组arr为引用类型,在未使用ref参数的情况下传递给方法。在此情况下,将向Change方法传递指向arr的引用的一个副本。Change方法有可能更改数组元素的内容,输出显示arr0从1改为888。但是,在Change方法内使用new运算符来分配新的内存部分,将使变量pArray引用新的数组。因此,这之后的任何更改都不会影响原始数组arr(它是在Main内创建的)。,该程序运行输出:调用方法前的数组第一元素:1方法内的数组第一元素:-3调用方法后的数组第一元素:888,引用传递值类型示例classPassingValByRef/参数X的值通过关键字ref来传递,改变x的值,将会改变输入的x的值staticvoidSquareIt(refintx)x*=x;System.Console.WriteLine(SquareIt方法内的n值:0,x);staticvoidMain()intn=5;System.Console.WriteLine(调用SquareIt方法前的n值:0,n);SquareIt(refn);/通过ref关键字来传递变量引用.System.Console.WriteLine(调用SquareIt方法后的n值:0,n);该程序运行输出:调用SquareIt方法前的n值:5SquareIt方法内的n值:25调用SquareIt方法后的n值:25本示例中,传递的不是n的值,而是对n的引用。参数x不是int类型,它是对int的引用(本例中为对n的引用)。因此,当在方法内对x求平方时,实际被求平方的是x所引用的项:n。,引用传递引用类型示例:classPassingRefByRefstaticvoidChange(refintpArray)/下面两个数组赋值都将改变原始的元素pArray0=888;/将pArray的第一个元素赋值为pArray=newint5-3,-1,-2,-3,-4;/pArray引用新的数组System.Console.WriteLine(Change方法内的数组第一元素:0,pArray0);staticvoidMain()intarr=1,4,5;System.Console.WriteLine(调用Change方法前的数组第一元素:0,arr0);Change(refarr);/通过ref关键字来传递数组引用System.Console.WriteLine(调用Change方法后的数组第一元素:0,arr0);该程序运行输出:调用Change方法前的数组第一元素:1Change方法内的数组第一元素:-3调用Change方法后的数组第一元素:-3本示例中Change方法内发生的所有更改都影响Main中的原始数组。实际上,使用new运算符对原始数组进行了重新分配。因此,调用Change方法后,对arr的任何引用都将指向Change方法中创建的五个元素的数组。,参数数组params当方法的参数数量不确定时,可以考虑使用参数数组params作为方法参数,如:voidUseParams(paramsintlist);在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。项目params1的代码如下:publicclassMyClasspublicstaticvoidUseParams(paramsintlist)for(inti=0;i=100,所以不改变数组值.for(inti=0;i“类”,在对话框名称处输入Employee.cs,按确定,即创建Employee类。右击项目Employee.cs节点,弹出菜单选择“查看类关系图”,生成类关系图ClassDiagram1.cd,包含类Employee。如下图.,创建枚举SexType和结构CertificateType,分别用于员工Employee类的性别和从业资格成员类型。可以在类关系图右击弹出菜单选择“添加”-“枚举”或“结构”来设计,也可在Employee.cs中直接编码如下:,下面通过类关系图设计类、枚举和结构三个类型。,enumSextype男,女,空;/性别枚举structCertificateType/从业资格结构类型publicboolblnTransact;/是否有交易资格publicboolblnIPO;/是否有发行资格publicboolblnAnalyse;/是否有分析资格publicCertificateType(boolblnTransact,boolblnIPO,boolblnAnalyse)this.blnTransact=blnTransact;this.blnIPO=blnIPO;this.blnAnalyse=blnAnalyse;根据员工表共有八栏信息,分别为Employee类添加添加8个字段,在类关系图右击Employee类弹出菜单选择“添加”-“字段”来设计,或直接编码如下:classEmployeeprivatestringname;/姓名privateSextypesex;/性别privatestringdept;/部门privateDateTimeenterDate;/进入日期privatestringaddr;/地址privatestringmobile;/手机号privateCertificateTypecertificate;/拥有从业资格privatestringmemo;/备注,为Employee类添加添11个属性,在类关系图右击Employee类弹出菜单选择“添加”-“属性”来设计,或右击某字段弹出菜单选择“重构”-“封装字段”来设计,或直接编码如下:(完全代码请看Employee.cs)publicstringName/名字属性getreturnname;setname=value;publicstringHasTransact/是否有交易资格属性getreturnthis.certificate.blnTransact?是:否;setif(value=是)certificate.blnTransact=true;elseif(value=否)certificate.blnTransact=false;为Employee类添加静态方法和构造涵数,在类关系图右击Employee类弹出菜单选择“添加”-“构造涵数“和“方法”来设计,或直接编码如下:,staticpublicSextypegetSextype(boolblnMan,boolblnWoman)/获取性别类型SextypeaSex;if(blnMan)aSex=Sextype.男;elseif(blnWoman)aSex=Sextype.女;elseaSex=Sextype.空;returnaSex;publicEmployee(stringname,Sextypesex,stringdept,DateTimeenterDate,stringaddr,stringmobile,CertificateTypecertificate,stringmemo)this.name=name;this.sex=sex;this.dept=dept;this.enterDate=enterDate;this.addr=addr;this.mobile=mobile;this.certificate=certificate;this.memo=memo;,编写EmployeeForm窗体事件代码,在EmployeeForm类添加方法reset():用于清空显示员工信息的控件内容和lvEmployeeReset()用于员工列表视图添加表头和清空:略。,在EmployeeForm类构造涵数中添加方法lvEmployeeReset(),reset()以初始化窗体。publicEmployeeForm()InitializeComponent();Reset();lvEmployeeReset();3.添加btnClear按钮click事件代码,同时用于工具栏清空按钮和新建员工菜单项事件处理代码。privatevoidbtnClear_Click(objectsender,EventArgse)this.Reset();4.添加方法lvEmployeeAdd(Employeeemp),使用Employee类对象为参数,将其添加到列表视图。privatevoidlvEmployeeAdd(Employeeemp)/向列表视图中添加项ListViewItemlvi=newListViewItem(emp.Name);lvi.Tag=emp;/在节点保存Employee对象lvi.SubItems.Add(emp.Sex.ToString();lvi.SubItems.Add(emp.Dept);lvi.SubItems.Add(emp.EnterDate.ToShortDateString();/略lvEmployee.Items.Add(lvi);,5.添加btnAdd按钮click事件代码,同时用于工具栏添加员工按钮和添加员工菜单项事件处理代码。privatevoidbtnAdd_Click(objectsender,EventArgse)if(txtName.Text=)MessageBox.Show(请输入姓名);return;if(lvEmployee.FindItemWithText(txtName.Text)!=null)MessageBox.Show(已有该员工资料);return;/取的性别类型SextypeempSex=Employee.getSextype(rbMan.Checked,rbWoman.Checked);CertificateTypeempCerticate=newCertificateType(clstCertificate.GetItemChecked(0),clstCertificate.GetItemChecked(1),clstCertificate.GetItemChecked(2);/取得从业资格结构类型Employeeemp=newEmployee(txtName.Text,empSex,cboDept.Text,enterDate.Value,txtAddr.Text,mtxtMobile.Text,empCerticate,rtxtMemo.Text);/创建employee类实例lvEmployeeAdd(emp);/添加employee类实例到列表视图。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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