面向对象的封装.ppt

上传人:小飞机 文档编号:6355835 上传时间:2023-10-20 格式:PPT 页数:24 大小:1.13MB
返回 下载 相关 举报
面向对象的封装.ppt_第1页
第1页 / 共24页
面向对象的封装.ppt_第2页
第2页 / 共24页
面向对象的封装.ppt_第3页
第3页 / 共24页
面向对象的封装.ppt_第4页
第4页 / 共24页
面向对象的封装.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《面向对象的封装.ppt》由会员分享,可在线阅读,更多相关《面向对象的封装.ppt(24页珍藏版)》请在三一办公上搜索。

1、第七章,面向对象的封装,2,目标,命名空间构造函数和析构函数实例变量与静态变量访问修饰符单例类 内嵌类 注册表类,3,命名空间,纽卡斯尔,纽卡斯尔,4,组织命名空间的最佳途径,2个项目开发小组分别开发Samsung与Philips的PC中的Monitor,所以都定义了Monitor类。整合项目时才发现类名冲突,于是首先想到更名为SamsungPCMonitor和PhilipsPCMonitor,但是长名称难以维护。怎样创建有条理,有结构的代码?通过使用命名空间,可以创建一套组织代码的系统。组织命名空间的最佳途径是采用层次结构系统的形式。可以在层次机构的顶部放置一些较为常规的名称,层级越低,名称

2、越具体,这种层次结构系统可以用嵌套命名空间来表示。,5,命名空间的基本语法,namespace SamsungPC class Monitorpublic void ListModels()Console.WriteLine(Samsung供应以下型号的显示器:);Console.WriteLine(14,15,17n);namespace PhilipsPCpublic class Monitorpublic void ListModelStocks()Console.WriteLine(Philips显示器的规格及其库存量:);Console.WriteLine(14=1000,15=20

3、00,17=3000n);,6,嵌套命名空间,namespace Samsung namespace PCclass Monitorpublic void ListModels()Console.WriteLine(Samsung供应以下型号的显示器:);Console.WriteLine(14,15,17n);namespace Mobileclass CMOSpublic void ListModels()Console.WriteLine(Samsung供应以下型号的手机:);Console.WriteLine(S1,S2,S3n);namespace Philipsnamespace

4、PCpublic class Monitorpublic void ListModelStocks()Console.WriteLine(Philips显示器的规格及其库存量:);Console.WriteLine(14=1000,15=2000,17=3000n);namespace Mobileclass CMOSpublic void ListModelStocks()Console.WriteLine(Samsung手机的规格及其库存量:);Console.WriteLine(P1=1000,P2=2000,P3=3000n);,7,怎样导入命名空间,如果程序频繁引用名字空间的成员,那

5、么每次引用时都必须指定名字空间,这很快就变得很复杂。using指令解决了这个问题。mSamsung=new();使用 using 命名空间指令可以使长且容易混淆的名称变得简短而且有意义using Philips.PC;Monitor mPhilips=new Monitor();,8,导入命名空间,using Philips.PC;using Philips.Mobile;class MonitorUserstatic void Main(string args)mSamsung=new();mSamsung.ListModels();cSamsung=new();cSamsung.ListM

6、odels();Monitor mPhilips=new Monitor();mPhilips.ListModelStocks();CMOS cPhilips=new CMOS();cPhilips.ListModelStocks();,9,访问修饰符,Teacher 类,private 成员,protected 成员,internal protected成员,internal 成员,Student 类,只有 Student 类和 Teacher 类都在同一程序集中,才可访问internal成员,不可访问,不可访问,不可访问,public 成员,可以访问,?,10,程序集,程序集是重用代码的一

7、种方式.net生成的有两种类型的文件(*.exe,*.dll)。*.exe文件代表应用程序,*.dll代表类库,不管是*.exe还是*.dll都是程序集。程序集是.net生成文件的统称,程序集是构成逻辑功能单元的类型和资源的集合。,11,编译程序集,根据下列步骤为什么不能正确编译程序?代码:Internal_Tom.cspublic class Mouse public string name;public void OutDoor()Console.WriteLine(我是一只鼠,名字叫0。,name);Console.WriteLine(“我肚子饿了,出门吃东西。”);Internal_J

8、ack.csinternal class Cat public string name;public void CatchMouse(Mouse mouse)Console.WriteLine(我是一只猫,名字叫0。,name);Console.WriteLine(抓到一只鼠,名字叫0。,mouse.name);Internal_JackAndTom.csclass JackAndTom static void Main()Mouse Tom=new Mouse();Tom.name=汤姆;Tom.OutDoor();Cat Jack=new Cat();Jack.name=杰克;Jack.C

9、atchMouse(Tom);编译:csc/target:library Internal_Jack.cscsc/target:library/reference:Internal_Jack.dll;Internal_Tom.cscsc/target:exe/reference:Internal_Jack.dll;Internal_Tom.dll Internal_JackAndTom.cs,12,构造函数,构造函数是类的一种特殊方法,每次创建类的实例都会调用它。通常用于初始化,与类同名,返回该类的对象。,访问修饰符,(),/构造函数的主体,语法:,/默认构造函数Employee()_qual

10、ification=研究生;,示例:,13,密封构造函数,面向对象框架的特性之一就是用户能够对框架进行扩展和定制,所使用的方法可能连框架的设计者都不曾预料到。这既是可扩展的强大之处,也是它的危险之处。因此,在设计框架的时候,当需要扩展时要小心涉及,而当扩展性存在危险时则要对其加以限制,这一点是非常重要的。有时候框架的设计者希望只让固定的一些类能队类层次进行扩展。例如,假设我们想要创建一个现存生物的类层次,它被分为两组且只能有两组:动物和植物。,14,密封构造函数,将下列代码在同一个项目中编译成一个程序集:public class LivingOrganisminternal LivingOrg

11、anism()Console.WriteLine(生物);public class Animal:LivingOrganismprotected Animal()Console.WriteLine(动物);public class Plant:LivingOrganismprotected Plant()Console.WriteLine(植物);,15,代码膨胀效应,比较两个类在被初始化时的性能:public class CodeExpandint age=0;string name=;double salary=0.0;public CodeExpand()public CodeExpan

12、d(int a)age=a;public CodeExpand(string n)name=n;public class CodeExpandNoneint age;string name;double salary;public CodeExpandNone()age=0;name=;salary=0.0;public CodeExpandNone(int a):this()this.age=a;public CodeExpandNone(string n):this()this.name=n;,16,实例变量与静态变量,静态变量和实例变量谁被先初始化?静态变量和实例变量谁被称为共享成员?静

13、态方法可以访问实例变量么?实例方法可以访问静态变量么?如何获取类被实例化的次数(即对象个数)?,17,实例变量与静态变量,静态变量先于实例变量被初始化静态变量被称为共享成员静态方法不可以访问实例变量实例方法可以访问静态变量静态构造函数没有访问修饰符,因为静态构造函数是私有的。静态构造函数至多执行一次创建类的实例或者引用类的任何静态成员才激发静态构造函数this 关键字将引用类的当前实例静态方法不可以访问this 指针this用来限定被相似的名称隐藏的成员this用来将对象作为参数传递到其他方法,18,静态成员初始化与静态构造函数,根据以下三条规则,指出下面这段代码输出什么?第一创建类的实例或者

14、引用类的任何静态成员才激发静态构造函数;第二静态成员初始化语句要先于静态构造函数执行;第三静态成员初始化语句与静态构造函数只执行一次。class Apublic static int X=B.Y;static A()+X;class Bpublic static int Y=A.X;static B()+Y;class C static void Main()Console.WriteLine();Console.WriteLine();,19,类的静态构造函数,指出下列代码的错误:public class 类的静态构造函数static void Main()tree tr1=new tree

15、();tree tr2=new tree(8.8,3);tree();tree(8.8,3);public class treestatic double height;int age;public static tree()height=8.8;this.age=3;public static tree(double h,int a)height=h;this.age=a;public tree()height=8.8;this.age=3;public tree(double h,int a)height=h;his.age=a;,20,单例类,怎样定义这样的类(称为单例类):1、只能有一

16、个实例。2、必须自己创建自己的唯一实例。3、必须给所有其它对象提供这一实例。使用单例类创建打印池:每台计算机可以有若干个打印机,但只能有一个打印池,避免多个打印作业同时输出到打印机。,21,结构的构造函数,判断下列struct的定义与初始化的正误:struct Point1p ublic int x,y;struct Point2public int x=0,y;struct Point3public int x,y;public Point3()x=y=9;struct Point4public int x,y;public Point4(int x)this.x=x;struct Poin

17、t5public int x,y;public Point5(int x,int y)this.x=x;this.y=y;public class test static void Main()Point1 p=new Point1();Console.WriteLine(p.x+p.y);Point1 p0;Console.WriteLine(p0.x+p0.y);Point1 p1;p1.x=3;p1.y=4;Console.WriteLine(p1.x+p1.y);Point2 p2;p2.y=4;Console.WriteLine(p2.x+p2.y);Point3 p3=new Po

18、int3();Console.WriteLine(p3.x+p3.y);Point4 p4=new Point4(3);Console.WriteLine(p4.x+p4.y);Point5 p5=new Point5(3,4);Console.WriteLine(p5.x+p5.y);,22,内嵌类,内嵌类是否作为外部类的静态成员存在?如何实例化内嵌类?内嵌类有哪几种访问修饰符?非内嵌类有哪几种访问修饰符?怎样在C#中使内嵌类可以访问外部类的非静态成员?何时应该使用/避免使用内嵌类?,23,注册表类,命名空间Microsoft.Win32类RegistryKey:表示 Windows 注册表

19、中的项级节点。此类是注册表封装。类Registry:提供访问注册表中的值和子项的基Registrykeys。方法RegistryKey.OpenSubKey:用指定的写访问权限检索指定的子项。方法RegistryKey.GetSubKeyNames:检索包含所有子项名称的字符串数组。方法RegistryKey.CreateSubKey:创建一个新子项或打开一个现有子项。方法RegistryKey.SetValue:设置指定的值。方法RegistryKey.DeleteSubKey:删除指定的子项。属性 RegistryKey.ValueCount:检索项中值的计数。属性 RegistryKey.SubKeyCount:在基级检索当前项的子项计数。,24,总结,变量与静态变量类是 C#中的一种结构,用于在程序中模拟现实生活的对象成员变量表示对象的特征方法表示对象可执行的操作如果类中未定义构造函数,则由运行库提供默认构造函数析构函数不能重载,并且每个类只能有一个析构函数命名空间用来界定类所属的范围,类似于Java中的包,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号