C#面向对象程序设计.ppt_第1页
C#面向对象程序设计.ppt_第2页
C#面向对象程序设计.ppt_第3页
C#面向对象程序设计.ppt_第4页
C#面向对象程序设计.ppt_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

教师:金海溶 办公室:QL329 第三章 C#面向对象程序设计 Visual C#.NET程序设计基础教程 第3章 类 面向对象程序设计:从客观世界的对象的属性、状态和行 为出发,进行复杂事物管理与问题求解。 类:是面向对象程序设计的基本构成模块 类的定义: 类是具有相同或相似属性和行为的对象的集合,它也是一 种数据结构,包含数据成员和函数成员。 数据成员类型:常量,字段,事件 函数成员类型:方法、属性、索引器、操作符、构造函数 和析构函数 静态成员:可以在类的实例之间共享,可以看作是类的 全局对象 ,不需要实例化类即可访问( 如int.Parse() p51-54,自学相关理论知识 Visual C#.NET程序设计基础教程 第3章 定义类 C#使用class关键键字来定义类义类 。其基本结结构如下: Class MyClass / class members 还还可以在类类定义义中指定继继承。C#支持类类的单单一继继承, 即只能有一个基类类,且 位于继继承列的首项项,语语法如下: class MyClass : MyBaseClass / class members 定义义抽象类类(不能实实例化的类类): public abstract class MyC lass 定义义不能被继继承的类类: public sealed class MyClass Visual C#.NET程序设计基础教程 第3章 4 类限类限制修饰符:制修饰符: publicpublic:可以被任可以被任意访问;意访问; protectedprotected:只可以被本类和只可以被本类和其派生类其派生类( (子类子类) )访问;访问; privateprivate:只可以被本类所访问。只可以被本类所访问。 internalinternal:只能在当前程序中被访问,即编只能在当前程序中被访问,即编译译后扩后扩展展 名为名为. .DLLDLL或或. .EXEEXE文件中的代码访问。文件中的代码访问。 protected internalprotected internal:唯一的一种组合限制修饰符,它唯一的一种组合限制修饰符,它 只可以只可以被当前程序内被当前程序内所有的类和这些类所有的类和这些类的派生类所访的派生类所访 问。问。 定义类 构造函数 p57 构造函数的函数名必须与类的名字相同,而且是没有任何返回值 ,用来实例化类的对象 class MyClass public MyClass() / 构造函数代码 / 类的其他成员定义 Visual C#.NET程序设计基础教程 第3章 析构函数 p58 类的析构函数是用类名和前缀来声明的。当释放对象 时,就执行析构函数中的代码,释放资源。在调用这个 析构函数后,还将隐式地调用基类的析构函数,包括 System. Object根类中的Finalize()调用。 class MyClass MyClass() /析构函数代码 Visual C#.NET程序设计基础教程 第3章 This的引用 在方法中,可以使用一个关键词this,来表示这个对象 本身。 在普通方法中,this 表示调用这个方法的对象; 在构造方法中,this 表示所新创建的对象。 Visual C#.NET程序设计基础教程 第3章 定义类成员 成员员定义义 所有成员员都有自己的访问级别访问级别 ,用下面的关键键字之 来定义义: u public成员员可以由任何代码访问码访问 。 u private成员员只能由类类中的代码访问码访问 u internal成员员只能由定义义它的工程内部的代 码访问码访问 。 u proteded成员员只能由类类或派生类类中的代码访码访 问问。 Visual C#.NET程序设计基础教程 第3章 l对对于class如果没有加修饰饰符,那么修饰饰符为为internal l对对于类类中的成员员如果没有加修饰饰符,那么修饰饰符为为private l对对于接口的成员员如果没有加修饰饰符,那么修饰饰符为为public 9 访问修饰符 Teacher 类 private 成员 protected 成员 public 成员 internal 成员 Student 类 只有 Student 类在 Teacher 类都在同一程序集中,才可访 问internal成员 不可访问 不可访问 可以访问 字段和属性 p66 通过属性和字段可以访问类中的数据,但属性和字段是 不同的 字段理解为类级别的变量、常量,用于存储该类的实例 的相关数据,在定义类时应该设置为私有 属性将类中的数据暴露于类外, 属性=字段(私有)+ 1到2个方法(取值方法get和赋 值方法set) Visual C#.NET程序设计基础教程 第3章 属性的定义 Public 字段类类型 属性名 get return 字段; /读读取字段 set 字段=value; /设设置字段 Visual C#.NET程序设计基础教程 第3章 字段和属性例子 class person private string name;/定义姓名字段name private string sex; /定义性别字段sex public string Name /定义姓名属性Name get return name; set name = value; public string Sex /定义性别属性Sex get return sex; set if(value.Equals(“男“)|value.Equals(“女“) |value.Equals(“male“)|value.Equals(“female“) sex = value; else sex=“未进行正确赋值”; Visual C#.NET程序设计基础教程 第3章 方法和事件 “方法”是包含一系列语句的代码块,它代表类的对 象的行为,完成某些处理功能 事件可以理解为是类或对象告诉我们发生某种状况 的一种方式。发送(或引发)事件的类称为“发行 者”,接收(或处理)事件的类称为“订户”。 例:按钮button1,则 button1.text 是属性; button1.onClick是事件; button1.doClick()是方法 Visual C#.NET程序设计基础教程 第3章 方法 方法使用标准函数格式,以及可访问性和可选的 static修饰符来声明 用static修饰的方法只能通过类访问,不能通过类 的对象访问,如 int.Parse( ) 可以在方法定义中使用下述关键字: extern方法定义放在其他地方。 abstract方法必须重写(只用于抽象类中)。 virtual方法可以重写。 override方法重写了一个基类方法(如果方法被 重写,就必须使用该关键字)。 Visual C#.NET程序设计基础教程 第3章 virtual和override virtual 用在基类中,指定一个虚方法(属性),表示 这个方法(属性)可以重写 override 用在派生类中,表示对基类虚方法(属性)的 重写 不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 修饰的 例子 Visual C#.NET程序设计基础教程 第3章 virtual和override例子 基类 public class BaseClass public virtual string GetString() return “这这是一个虚方法。“; 派生类类 public class SonClass : BaseClass public override string GetString() return “这这是重写了的方法。“; Visual C#.NET程序设计基础教程 第3章 类成员的其他议题 隐隐藏基类类方法 当在派生类类中定义义了一个和基类类同名的方法,格 式如下: new public void function() 则则基类类中的该该方法在派生类类中被隐隐藏了 Visual C#.NET程序设计基础教程 第3章 class mybase public void dosomething() Console.WriteLine(“base“); class myderive : mybase new public void dosomething() Console.WriteLine(“derive“); 类成员的其他议题 隐隐藏和重写的区别别 Visual C#.NET程序设计基础教程 第3章 3.3.2 类成员的其他议题 结论结论 : 重写:当派生类转换为类转换为 基类时类时 ,重写的方法依然可 以调调用 隐隐藏:当派生类转换为类转换为 基类时类时 ,派生类类的方法被基 类类的被隐隐藏方法代替 调调用重写或隐隐藏的基类类方法 base.functionname(); 例子 Visual C#.NET程序设计基础教程 第3章 调用重写或隐藏的基类方法例子 class A private int a=2; private int b=2; public virtual int calculate() return a+b; Visual C#.NET程序设计基础教程 第3章 class B : A public override int calculate() return base.calculate()/2; 类定义任务 编写一个矩形类,私有数据成员为矩形的长(len )和宽(wid),无参构造函数将len和wid设置为0, 有参构造函数设置相应的len和wid,类包括属性: LEN和WID,分别为矩形的长和宽;类的公有方法 有:求周长、求面积。 在主函数中创建2个矩形实例,一个使用构造函数 设置长为5,宽为4,另一个创建时不提供长和宽的 值,创建后通过属性设置长和宽,最后请输出两个 矩形的长,宽,周长和面积。 Visual C#.NET程序设计基础教程 第3章 类的使用一 使用Array类中的reverse方法实现字符串逆序 Visual C#.NET程序设计基础教程 第3章 类的使用二 使用ArrayList类中的reverse方法实现句子中单词位置的 逆序 happy birthday to you you to birthday happy string s = Console.ReadLine(); ArrayList arr = new ArrayList(s.Split( ); arr.Reverse(); string str=string.Join (“ “, (string )arr.ToArray( typeof(string); Console.WriteLine(str); Visual C#.NET程序设计基础教程 第3章 Visual C#.NET程序设计基础教程 第3章 任务 Visual C#.NET程序设计基础教程 第3章 类的使用三 编写一个类MyRead,程序集为MyRead.dll;命名空间 MyDll,分别提供整数和浮点数的输入方法 MyRead.ReadInt( ):实现整数的输入,用逗号或空格隔开 MyRead.ReadDouble():实现浮点数输入,并用逗号或空格隔开 实现方法: Visual C#.NET程序设计基础教程 第3章 类的使用三 Visual C#.NET程序设计基础教程 第3章 类的使用三 Visual C#.NET程序设计基础教程 第3章 类的使用四 Visual C#.NET程序设计基础教程 第3章 从键盘输入一组整数,并按降序进行排序存放,并 将排序后的整数输出 在此例中,我们使用自定义命名空间MyDll中的 MyRead类协助数据的读取 实现步骤如下 u新建项目intsort u引用MyRead命名空间所在的程序集MyRead.dll到项目中 u在项目文件中使用using导入命名空间MyDll u使用MyRead类中的静态方法MyRead.ReadInt()读入数据 u实现排序与输出 类的使用四 Visual C#.NET程序设计基础教程 第3章 将程序集复制到项 目的某文件夹 添加引用 using System; using System.Collections.Generic; using System.Text; using MyDll; namespace intsort class Program static void Main(string args) int a; Console.WriteLine(“请输请输 入一组组整数“); a = MyRead.ReadInt(); Array.Sort(a); Array.Reverse(a); foreach (int aa in a) Console.Write(“00“, aa); Visual C#.NET程序设计基础教程 第3章 类的静态方法由类直接 调用,不需要通过实例 接口 p76-80 接口是在功能的使用者和提供者之间间建立的规规范,它 定义义了功能数量,函数名称,参数,参数顺顺序。 接口不能实实例化,接口的成员员都是公有的 接口声明的方式与声明类类的方式相似: interface ImyInterface / interface members 接口可以继继承: public interface IMyInterface : IMyBaseInterface, ImyBaseInterface2 / interface members Visual C#.NET程序设计基础教程 第3章 接口 接口成员的定义与类成员的定义也相似,但有几个 重要的区别: 不允许使用访问修饰符,所有的接口成员都是公共 的 接口成员不能包含代码体。 接口不能定义字段成员。 接口成员不能用关键字static,virtual,abstract或 sealed来定义。 Visual C#.NET程序设计基础教程 第3章 在类中实现接口 执行接口的类必须包含该接口所有成员的执行代码 ,且必须匹配指定的签名,并且必须是公共的。 继承一个实现给定接口的基类,就意味着派生类隐 式地支持这个接口 Visual C#.NET程序设计基础教程 第3章 在类中实现接口例子 /定义义接口 interface Ipoint void DisplayValue(); void DisplayValue2(); /在testclass1中实现实现 接口 public class TestClass1 : Ipoint public void DisplayValue() Console.WriteLine(“A“); public void DisplayValue2() Console.WriteLine(“B”); Visual C#.NET程序设计基础教程 第3章 /在testclass2中实现实现 接口 public class TestClass2 : Ipoint public void DisplayValue() Console.WriteLine(“1“); public void DisplayValue2() Console.WriteLine(“2”); /testclass2结结束 在类中实现接口例子续 using System; using System.Collections.Generic; using System.Text; namespace interface_emp class testMain STAThread static void Main() Visual C#.NET程序设计基础教程 第3章 /测试测试 接口 TestClass1 t1 = new TestClass1(); t1.DisplayValue(); t1.DisplayValue2(); TestClass2 t2 = new TestClass2(); t2.DisplayValue(); t2.DisplayValue2(); Console.ReadKey(true); System.Collections.Icomparer接口的实现与应用1 实现对结实现对结 构体student的排序 struct student public string sname; public int age; public int score; 要求: u实现对实现对 学生年龄进龄进 行升序排序后输输出记录记录 u实现对实现对 学生成绩绩降序排序后输输出记录记录 Visual C#.NET程序设计基础教程 第3章 System.Collections.Icomparer接口的实现与应用2 Visual C#.NET程序设计基础教程 第3章 System.Collections.Icomparer接口的实现与应用3 Visual C#.NET程序设计基础教程 第3章 sortstudent_age agesort = new sortstudent_age(); sortstudent_score scoresort = new sortstudent_score(); Console.WriteLine(“按年龄从小到大排序“); arr.Sort(agesort); foreach (student s in arr) Console.WriteLine(“name :” + s.sname + “ age:” + s.age + “ score:” + s.score); Console.WriteLine(“nn按成绩从高到低排序“); arr.Sort(scoresort); arr.Reverse(); foreach (student s in arr) Console.WriteLine(“name :“+ s.sname + “ age:“ + s.age + “ score:“ + s.score); /main函数结束 /program class结束 System.Collections.Icomparer接口的实现与应用4 Visual C#.NET程序设计基础教程 第3章 class sortstudent_age : IComparer public int Compare(object a, object b) return (student)a).age - (student)b).age; class sortstudent_score : IComparer public int Compare(object a, object b) return (student)a).score - (student)b).score; /namespace结束 复制 System.Object.MemberwiseClone():创创建一个新 对对象,然后将当前对对象的非静态态字段复制到该该新 对对象。 如果字段是值类值类 型的,则对该则对该 字段执执行逐位复制 。 如果字段是引用类类型,则则复制引用但不复制引用 的对对象;因此,原始对对象及其复本引用同一对对象 进进行引用复制。 Visual C#.NET程序设计基础教程 第3章 复制 public class IdInfo public int IdNumber; public IdInfo(int IdNumber) this.IdNumber = IdNumber; public class Person public int Age; public string Name; public IdInfo IdInfo; public Person GetCopy() return (Person)this.MemberwiseClone(); Visual C#.NET程序设计基础教程 第3章 public static void Main() Person p1 = new Person(); p1.Age = 42; p1.Name = “Sam“; p1.IdInfo = new IdInfo(6565); Person p2 = (Person) p1. GetCopy(); p1.Name = “Frank“; p1.IdInfo.IdNumber = 7878; Console.WriteLine( p1.Name+ p1.IdInfo.IdNumber); Console.WriteLine( p2.Name+ p2.IdInfo.IdNumber); 深度复制 修改GetCopy()方法就可以进行深度复制 .NET Framewok提供了ICloneable接口来实现深度 复制 该接口有一个方法Clone(),这个方法不带参数, 返回一个对象类型。 但必须通过实现ICloneable接口的Clone()方法才能 实现真正的深度复制 Visual C#.NET程序设计基础教程 第3章 深度复制 public class IdInfo:ICloneable public int IdNumber; public IdInfo(int IdNumber) this.IdNumber = IdNumber; public object Clone() return MemberwiseClone(); Visual C#.NET程序设计基础教程 第3章 public class Person:ICloneable public int Age; public string Name; public IdInfo IdInfo; public object Clone() Person other = (Person)this .MemberwiseClone(); other.IdInfo = (IdInfo)other .IdInfo.Clone(); return other; 索引器 索引器:使得对象可以像数组那样被方便,直观的 引用,它为我们提供了通过索引方式方便地访问类 的数据信息的方法 Visual C#.NET程序设计基础教程 第3章 索引符(器) 索引器语法: 访问修饰符 返回类型 this 参数列表 get return 类中的集合或数组 参数列表 ; set 类中的集合或数组 参数列表 =value; Visual C#.NET程序设计基础教程 第3章 索引符(器) 索引器:使得可以像数组那样对对象使用下标,它为 我们提供了通过索引方式方便地访问类的数据信息的 方法 索引器的名称只能是this,必须至少有一个参数 可以重载,因为索引器有参数 可以通过索引器方便的访问类中的数组或者集合 Visual C#.NET程序设计基础教程 第3章 索引符(器)例子 Visual C#.NET程序设计基础教程 第3章 编写一个类,包含一个100元素的整型数组,要求 给类设计一个索引器,实现通过类名索引值的方 式直接访问类中数组的元素 class test private int a = new int100; public int this int index get return aindex ; set aindex = value ; static void Main(string args) test t = new test(); for (int i = 0; i u 比较运算符:=,!=,= 例子 Visual C#.NET程序设计基础教程 第3章 例子 public enum MFNone, H2, O2, H2O ; /枚举 public class Chemical private MF _element; public MF Element /定义属性 get return _element; set _element = value; public Chemical(MF element) /构造函数 Element = element; Visual C#.NET程序设计基础教程 第3章 完整程序见备注 例子续 /重载 +运算符 public static Chemical operator +(Chemical c1, Chemical c2) if (c1.Element = MF.H2 return new Chemical(MF.None); / Chemical 类定义结束 /以下这段放在main()中 Chemical c1 = new Chemical(MF.H2); Chemical c2 = new Chemical(MF.O2); Chemical c3 = c1 + c2; MessageBox.Show(c3.Element.ToString(); Visual C#.NET程序设计基础教程 第3章 上机作业 定义类义类 student 私有字段:name,score 属性:NAME,SCORE(0100分) 构造函数2个:无参数和带带参数(姓名,成绩绩) 方法: GiveScore(int a):成绩绩加a分 TakeOffScore(int a):成绩绩减a分 创创建2位学生对对象,张飞张飞 和刘备备,成绩绩分别为别为 87 和93 制作下一页页的界面,并实现实现 正确赋值赋值 和按钮钮功能 Visual C#.NET程序设计基础教程 第3章 设计界面要求 Visual C#.NET程序设计基础 教程 第4章 Label ComboBox(编辑项) TextBox Button 部分提示1 按要求定义student类 制作界面,特别提示: ComBoBox控件是下拉列,添加下拉列表项的方法:选择控件,单击 右上角的三角,然后单击编辑项,在弹出的编辑框中输入数据,注意 一个姓名一行,完成后单击确定即可 为class form1添加两个数据成员 Visual C#.NET程序设计基础教程 第3章 部分提示2 添加form1的load事件的处理函数,使程序运行一开始,在界面上 显示张飞和刘备的初始成绩,并使ComBoBox控件选中第一项, 步骤如下: 选中form控件,双击form控件的空白处,添加load事件处理方法 编写处理函数 1 创建张飞和刘备两个学生对象,并初始化数据成员 2 将两个学生的成绩在界面的正确位置显示 3 ComBoBox默认选中第一项 Visual C#.NET程序设计基础教程 第3章 部分提示3 编写加分按钮处理代码 编写减分按钮处理代码 以上代码均为参考代码,需要根据实际情况修改 Visual C#.NET程序设计基础教程 第3章 end Visual C#.NET程序设计基础教程 第3章 抽象类 我们在分析问题时,越往上分析,就感觉结构越抽象。比如,我 们分析动物的捕猎行为:这几种动物是群力合作,那几种动物是 耐心守候,那几种动物是致命一击他们都有一个方法叫“捕猎 ”,只是我们无法给他们一个统一的过程。此时我们可以在他们的 基类中定义一个抽象方法,该方法什么事也不做,只是占个名字 。然后在具体的派生类中重写hunt()的实现方法。 public abstract class HuntingAnimal public abstract void Hunt(); public class Tiger : HuntingAnimal public override void Hunt() / Visual C#.NET程序设计基础教程 第3章 Console.WriteLine()格式化字符串 格式:index,alignment:formatString “index”指索引占位符,代表变变量在列表中的位置 “,alignment”按字面意思显显然是对齐对齐 方式,以“,”为标为标 记记。alignment的绝对值绝对值 表示字段宽宽度,负负数表示 左对齐对齐 ,正数表示有

温馨提示

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

评论

0/150

提交评论