面向对象与现代软件组件系统
本文档从较低层的角度分析面向对象与现代软件组件系统,文档中部分看法与目前流行看法可能有不同,仅代表笔者个人观点.本文档适合对面向对象或者com有一定基础的读者阅读. 【程序编程相关:Generic<Programmi】
(v0.01) 【推荐阅读:在MFC下使用OpenGL的一个简单的例】
本文档中,未经特殊说明,不加区分地使用“属性(property)”/“成员变量(member variable)”与“方法(method)”/“成员函数(member function)”词汇. 【扩展信息:No MFC,Only API】
本文档中的“属性(property)”一词,如果未特殊说明“com接口属性”.“自动化属性”等与com/activex相关的“属性”,相当于c++中的成员变量(member variable)或者object pascal/delphi中的字段(field),通常泛指对象的特征,与com/activex中通常相当于一对get/set方法的属性不同.
本文档中的com,未经特殊说明,泛指com/dcom/mts/com+ 1.0.
本文档中的源程序,未经特殊说明,均使用visual c++ .net(visual c++ 7.0)开发.
第1篇 面向对象第1章 对象与类的本质
1.1.对象(object)的本质
许多面向对象java/j2me/code/ target=_blank>程序设计或者c++的书上都会这样说:“对象有属性(property)与方法(method).”
但是在真实世界中,说“对象”有“属性”说得通,但是“对象”有“方法”吗?假设有一辆自行车,把自行车看作“对象”,那么“自行车对象”确实有“属性”,例如自行车是26的还是28的,是男式的还是女式的,是黑色的还是银灰色的……这都是实实在在的“属性”,也就是具体对象的特征.但是如果说“自行车对象”有“方法”,这话可就有些不通了,例如说自行车对象有“行驶”或者“停止”“方法”,那倒要问问:谁能从一辆自行车上“看出”它有“行驶”或者“停止”“方法”?除非他有特异功能!
属性是静态的(但是不是不可变的),反映了一个具体对象的特征,但是方法是动态的,是对象的使用者(或者调用者)对于对象具体的操作,也就是说方法是针对对象的,只能说方法可用于(或者适合)对象,也可以说对象支持方法,不应该说对象有方法.对象只有属性(或者特征),但是对象支持方法,而且通常方法可以操作属性.
一般程序员不容易接受笔者的看法,因为编写程序时,是通过对象调用方法的,为此笔者编写了一个简单的c++实例程序,试图说明该问题.程序通过简单的类抽象模拟“神舟”飞船(仿照“inside visual c++”/«visual c++技术内幕»一书),并创建模拟飞船对象.程序工程是简单的win32控制台(console)工程,在命令行(ms—dos方式)下执行,主程序源程序如下(shenzhou_classandobject.cpp):
// shenzhou_classandobject.cpp : 定义控制台应用程序的入口点.
//#include "stdafx.h"
file://模拟“神舟”飞船类
class cshenzhou
{public: int m_position; cshenzhou(); void fly(); file://模拟飞船飞行 int getposition(); file://模拟航天测控(获取飞船位置)};cshenzhou::cshenzhou()
{ m_position=100;}void cshenzhou::fly()
{ _tprintf(_t("fly!\n"));}int cshenzhou::getposition()
{ return m_position;}int _tmain(int argc, _tchar* argv[])
{ cshenzhou shenzhou1; file://模拟飞船对象 _tprintf(_t("the size of the shenzhou1 object: %d\n"),sizeof(shenzhou1)); shenzhou1.fly(); _tprintf(_t("the position of the shenzhou 1 spaceship: %d\n"),shenzhou1.getposition()); return 0;}程序运行结果如下:
the size of the shenzhou1 object: 4
fly!the position of the shenzhou 1 spaceship: 100有1个成员变量与3个成员函数(其中1个是构造函数)的类的对象,大小(所占内存空间)只有4字节,正好相当于1个成员变量(int数据类型)的大小,显然,成员函数并不包含在对象中.
上例可以证明:对象中只包含属性,并不包含方法.
那么为什么编写程序时,是通过对象调用方法呢?将上例的工程编译成exe文件(使用release配置),然后用ida pro v4.17反汇编,检查部分反汇编程序(部分注释是笔者加的):
……; cshenzhou类的构造函数
sub_0_401000 proc near ; code xref: sub_0_401030+5p
mov eax, ecx mov dword ptr [eax], 64h retnsub_0_401000 endp……
; cshenzhou::fly成员函数
sub_0_401010 proc near ; code xref: sub_0_401030+1dp
push offset afly ; "fly!\n" call sub_0_401070 pop ecx retnsub_0_401010 endp……
; cshenzhou::getposition成员函数
sub_0_401020 proc near ; code xref: sub_0_401030+26p
mov eax, [ecx] retnsub_0_401020 endp……
; _tmain函数
... 下一页