对象及组件技术_第1页
对象及组件技术_第2页
对象及组件技术_第3页
对象及组件技术_第4页
对象及组件技术_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、对象与组件技术课程自学指导及作业课程名称:对象与组件技术教学目标:通过对本门课程学习,使学生学习高级的编程技术和思想,巩固原有知识教材:com原理与应用,潘爱民著,清华大学出版社出版社参考书目:com本质论,潘爱民译著,中国电力出版社授课教师:王涛联系电话:邮箱:自学进度表周次自学内容作业完成内容1类和对象基本概念编写一个类2多态的含义编写虚函数3对象和组件的基本概念理解服务对象和接口4学习简单的组件技术学会使用动态链接库来编写组件5学习进程内组件编写一个进程内组件6学习包容和聚合的基本概念理解包容和聚合的作用和简单实现原理7学习进程外组件基本知识编写进程外组件8学习自动化自动化基本含义课程自

2、学要求及作业:第一章 类和对象基本概念本章学习目的与要求:学习c+类和对象的基本概念和实现方式本章学习重点、难点及注意问题:类的编写基本方法,对象的调用。本章考核知识点:类,对象,继承。作业题:1、 编写一个学生类,包括学号,姓名,年龄三个属性,并有一个显示的成员函数diplay,在屏幕上打印出三个函数。答:#include<stdio.h>#include<xstring>#include <WTypes.h>class CStudentpublic:/构造函数CStudent();/重载构造CStudent(LPSTR szName, byte byAg

3、e, int nID);/析构函数CStudent();protected:LPSTRm_szName;/学生姓名bytem_byAge;/学生年龄intm_nID;/学生学号/功能函数public:/学生信息void SetStudentInf(LPSTR szName, byte byAge, int nID);/获取学生信息void GetStudentInf(LPSTR &szName, byte &byAge, int &nID);/实现类方法CStudent:CStudent()m_szName = NULL;m_byAge = 0;m_nID = 0;CS

4、tudent:CStudent(LPSTR szName, byte byAge, int nID)m_szName = szName;m_byAge = byAge;m_nID = nID;CStudent:CStudent()void CStudent:SetStudentInf(LPSTR szName, byte byAge, int nID)m_szName = szName;m_byAge = byAge;m_nID = nID;void CStudent:GetStudentInf(LPSTR &szName, byte &byAge, int &nID)

5、szName = m_szName;byAge = m_byAge;nID = m_nID;void main()CStudent Student;Student.SetStudentInf("例子",22,1000);LPSTR lpName=NULL;byte byAge=0;int nID=0;Student.GetStudentInf(lpName,byAge,nID);printf("学生姓名:%s,年龄:%d,学号:%d",lpName,byAge,nID);getchar();2、 写一个类A,作为父类,有一个成员变量x,类B共有继承类A,

6、有个成员y。 答:class A Private int y; Class B Extents A Private int y; 第二章 多态的含义本章学习目的与要求:学习上溯和虚函数。理解多态的含义本章自学重点、难点及注意问题:上溯的含义,多态本章考核知识点:上溯,多态,虚函数作业题:1、上溯是什么?答:就是将子类对象赋值给超类对象,看上去像父类的对象拥有的是父类成员变量,但是调用的确是子类的方法,这个方法是重构或者继承自父类而来的方法,从而可以完成自顶向下的调用过程。2、 虚函数的作用是什么。答:虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,

7、可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。 3、 有虚函数的类的对象的函数调用过程是什么。 答:当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类;在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果

8、是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。第三章 对象和组件的基本概念本章学习目的与要求:学习组件的基本含义,学习com组件的基本内存模型本章自学重点、难点及注意问题:com组件的基本内存模型,接口本章考核知识点:内存模型,接口。作业题:1、 什么是组件,什么是com?答:组件:组件(Component)是对数据和方法的简单封装一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法

9、。属性是组件数据的简单访问者。 Com:所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。2、 接口是什么。 答:接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 3、 com的基本内存模型是什么样的。 答:AddRef和Release实现的是一种名为引用计数的内存管理技术,这种技术是使组件能够自己将自己删除的最简单同时也是效率最高的方法。COM组

10、件将维护一个称作是引用计数的数值。当客户虫组件取得一个接口时,此数值增1,当客户使用完某个接口后,此数值将减1。当此数值为0时,组件即可将自己从内存中删除第四章 学习简单的组件技术本章学习目的与要求:学习利用dll去生成一个简单组件本章自学重点、难点及注意问题:dll的编写过程,组件的编写过程本章考核知识点:clsid,dll,idd作业题:1、 Iunkown接口有几个函数,函数的作用都是什么?答:客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是Iunkown,它的定义包含在Win32 SDK中的UNKOWN.h头文件中;客户可以调用Que

11、ryInterface函数来决定组件是否支持某个特定的接口。所有的COM接口都需要继承IUnkown,因而每个COM接口的vTable中的前三个函数都是QueryInterface、AddRef和Release。这使得所有的COM接口都可以被当成IUnkown接口来处理。2、 如何控制服务对象的生存周期答:COM 对象的生存周期分为两部分来讲:客户端与 COM 本身: 在客户端,视定义的COM对象接口而定,像我们例子中的v_Obj,定义成全局变量,那么COM对象在创建时产生,只有在程序退出时才被释放。我们也可以在形式上将其释放,如:v_Obj:=nil,这样这个COM接口就无效了。在COM本身

12、,COM接口的通过记数的方式来完成COM的生存周期,COM可能同时被多个程序所调用。有一个程序连接到COM时计数器加1,某个释放时计数器减1,当计数器为0时,COM对象才真正从内存中移除3、 clsid是什么,iid是什么?答:CLSID是指windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配一个唯一表示它的ID代码,用于对其身份的标示和与其他对象进行区分,IID是:它是一个结构,接口标识符结构。IID标识了客户所需的接口。每一个接口都有一个唯一的接口标识符。所以某个与IID相对应的接口绝对不会发生变化。接口IID决定了COM组件的版本。不同的接口具有不同

13、的ID,包括不同版本的接口。第五章 学习进程内组件本章学习目的与要求:学习进程内组件。本章自学重点、难点及注意问题:类厂的作用,组件建立和客户端调用过程。本章考核知识点:上溯,多态,虚函数作业题:1、 进程内组件是如何实现的。客户端如何调用一个进程内组件的函数。答:客户:CLSID clsid;IClassFactory* pClf;IUnknown* pUnk;CoInitialize(NULL);CLSIDFromProgID(“组件名”,&clsid);COM:COM在注册表中根据“组件名”查找ID客户:CoGetClassObject(clsid,CLSCTX_INPROC_S

14、ERVER,NULL,IID_IClassFactory,(void*)&pClf);COM:COM在内存中根据类ID查找组件if (组件DLL还没被载入) COM从注册表中获得DLL文件名COM把组件DLL载入进程内存DLL组件:if(组件刚被载入)全局厂对象被构造调用DLL的InitInstance (MFC)COM:COM根据传给CoGetClassObject的CLSID值来调用DLL的全局导出函数DLL GetClassObjectDLL组件:DLLGetClassObject返回IClassFactory*COM:COM为客户返回IClassFactory*客户:pClf-

15、>CreateInstance(NULL,IID_IUnknown,(void* &pUnk);DLL组件:类厂的CreteInstance函数被调用(通过组件的Vtable直接调用)构造“组件名”类的对象返回请求的接口指针客户:pClf->Release( );pUnk->Release( );DLL组件:通过Vtable,”组件名”的Release被调用if (refcount = 0)对象自身被析构客户:CoFreeUnusedLibraries( );COM:COM调用DLL的全局导出函数DLLCanUnloadNowDLL组件:DLLCanUnloadNow

16、被调用,if(所有DLL的对象被析构)return TRUE;客户:CoUninitialize( );COM:COM释放资源客户:客户退出DLL组件:若DLL仍然在内存中,而无其它程序使用它,Windows把它卸载。2、 类厂是什么?答:类厂是另外一种类型的工厂,在这种“工厂”中我们可以制造出所需的组件,这种工厂被称作是类厂。类厂实际上也是一个组件。第六章 学习包容和聚合的基本概念本章学习目的与要求:学习包容和聚合。本章自学重点、难点及注意问题:包容和聚合本章考核知识点:包容聚合作业题:1、 包容是什么,怎么实现的。答:包容是外部组件包含指向内部组件接口的指针.外部组件相对来说是内部组件的一

17、个客户,它将使用内部组件的接口来实现它自己的接口;实现起来主要通过外部组件完全控制内部组件的生存期,外部组件内部维护一个内部组件实例,外部组件为了扩充提供内部组件的接口必须同样声明相应的接口,实现部分则简单地调用内部组件的接口。 2、 聚合和包容的区别是什么。答:在COM组件中,包容是在接口级别来完成的。外部组件包含指向内部组件接口的指针。此时外部组件仅仅是内部之间的使用客户而已;它将使用内部组件的接口来实现自己的接口。外部组件也可以通过调用转发给内部组件的方法来实现内部组件所支持的每个接口,并且可以在调用代码前后添加适当的修改,聚合是包容的一种变化形式。当外部组件聚合内部组件的一个接口的时候

18、,它并没有像包容那样重新实现此接口,而是显示地将调用请求转发给内部组件接口,但是用户却并不知道他正在和两个组件打交道。第七章 学习进程外组件基本知识本章学习目的与要求:学习进程外组件的编写。本章自学重点、难点及注意问题:进程外组件的编写。桩,存根。本章考核知识点:进程外组件,桩,存根作业题:1、 进程外组件和进程内组件编写的不同。 答:所谓进程内组件是指客户程序和组件程序在同一个进程地址空间内;进程外组件指客户程序和组件程序分别处在不同的进程空间地址中。进程内组件是通过将组件作为动态连接库(DLL)来实现的,客户程序将组件程序加载到自己的进程地址空间后再调用组件程序的函数。对于这两种不同的组件,客户程序和组件程序交互的内在方式是完全不同的。但是对于功能相同的进程内和进程外组件,从程

温馨提示

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

评论

0/150

提交评论