com学习笔记(1)基础接口的定义
2009-07-05 12:05
148 查看
看com组件方面的东西大概也有3个多月了.看到com本质论的作者说6个月才对com有感觉,所以我深感欣慰哈…之前学习com完全是为了wpf,然后就一发不可收拾,知识体系发生非常大的变化.看的第一本书是潘爱民的 com原理与应用,此书是作者看了n多书总结的,像我等初学者看了这么多理论,非常之艰难,这书可不是什么武打小说,均是密密麻麻的理论...不过还是苦苦坚持看了2个月,后来发现com技术内幕和com本质论,先从com技术内幕开始就好多了。我们还是少一些理论,多一些代码,学起来就有乐趣多了.然后提出疑问.
所以学习的资料则是
com技术内幕
com本质论
com原理与应用
c++没有接口概念,只有抽象类.
class IX
{
public:
virtual void Fx1() = 0 ;
virtual void Fx2() = 0 ;
} ;
public:
// Implement interface IX.
virtual void Fx1() {cout << "CA::Fx1" << endl ;}
virtual void Fx2() {cout << "CA::Fx2" << endl ;}
}
到这里为止跟com一点关系都没有的.
二.接口定义的简化(伪纯抽象类)
由于c++并无interface关键字,为了编码约定,可以用#define关键字定义,将类改成接口.#define interface struct
现在我们可以重新定义IX,注意此处不用把方法标记为public,struct默认把成员公开.这样就简化了接口的定义
如下interface IX
{
virtual void Fx1() = 0 ;
virtual void Fx2() = 0 ;
} ;
这样是不是很简单了?
由于c++编译器各不同,方法的调用方式各有不同,可先参考这里.
微软平台的com接口大部分(即推荐用法,话不敢说死,所以无需纠缠)均采用__stdcall这种标准调用约定
现在为每个方法加上__stdcall调用约定,如下代码interface IX
{
virtual void __stdcall Fx1() = 0 ;
virtual void __stdcall Fx2() = 0 ;
} ;
当然具体实现的类,也需要改变,如下代码class CA : public IX{
public:
virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;}
virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;}
}
{
CA* pA = new CA ;
// Get an IX pointer.
IX* pIX = pA ;
pIX->Fx1() ;
pIX->Fx2() ;
delete pA ;
return 0 ;
}
到目前为止,跟com组件根本搭不上边.我们且称这是一个组件(中间件,类库…)都可以.
五.虚拟函数表vtbl(virtual function table)
1.虽然com接口号称语言,无关性,为何我们还是选择c++作为编写的语言,而不是c#或者java?
2.c++抽象基类怎么说成是com接口?
我们先重新来看那段接口的代码.interface IX
{
virtual void __stdcall Fx1() = 0 ;
virtual void __stdcall Fx2() = 0 ;
} ;
又是概念
当定义了一个抽象基类,也就定义了相应的内存结构,派生类实现了该抽象类才会被分配.
虚拟函数表包含一组指向虚拟函数实现的指针.
以上可以不管.下面的话才是重要的.
似乎是偶然的巧合,com接口的内存结构同c++编译器为抽象基类等所生成的内存结构是相同的。。。
由于这个巧合,IX即是接口,又是抽象基类。
由于这个巧合,我们就选择了c++,就像阿里的招聘广告 If not you,who?
六.关于类,接口,组件的一些简单理论概念
1.类非组件
组件这一称法太过专业,可以当作一个功能模块,按我的理解可以一个控件也是一个组件,如DataGrid是一个组件,DataGrid是由n多类组成一个功能强大的控件,所以类非组件. 话说话来,简单的组件也可以由一个类组成。概念而已,无需理会.不知道也不会怎么样…
2.接口与类的继承关系
一个类可以继承多个接口实现,也可以由一个接口一个类实现…
3.多重接口继承
即多个类继承相同接口(可以是多个接口),不同实现…
4.命名冲突
怎么办?改名…要是遇到别人骚扰你,你改名,他也改名就没办法了...
好了,先写到这里.这篇其实与com组件基本无关的.
所以学习的资料则是
com技术内幕
com本质论
com原理与应用
一.c++接口的实现
c++没有接口概念,只有抽象类.
1.定义接口(纯抽象类)
如下,用virtual关键字表明该方法为抽象方法,未实现的方法后面+ =0class IX
{
public:
virtual void Fx1() = 0 ;
virtual void Fx2() = 0 ;
} ;
2.实现接口
类可以多重继承,但为了简单,所以就用一个接口.class CA : public IX{public:
// Implement interface IX.
virtual void Fx1() {cout << "CA::Fx1" << endl ;}
virtual void Fx2() {cout << "CA::Fx2" << endl ;}
}
到这里为止跟com一点关系都没有的.
二.接口定义的简化(伪纯抽象类)
由于c++并无interface关键字,为了编码约定,可以用#define关键字定义,将类改成接口.#define interface struct现在我们可以重新定义IX,注意此处不用把方法标记为public,struct默认把成员公开.这样就简化了接口的定义
如下interface IX
{
virtual void Fx1() = 0 ;
virtual void Fx2() = 0 ;
} ;
这样是不是很简单了?
三.标准调用
由于c++编译器各不同,方法的调用方式各有不同,可先参考这里.
微软平台的com接口大部分(即推荐用法,话不敢说死,所以无需纠缠)均采用__stdcall这种标准调用约定
现在为每个方法加上__stdcall调用约定,如下代码interface IX
{
virtual void __stdcall Fx1() = 0 ;
virtual void __stdcall Fx2() = 0 ;
} ;
当然具体实现的类,也需要改变,如下代码class CA : public IX{
public:
virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;}
virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;}
}
定义好接口和实现这些接口后,我们接下就是要使用这些接口
四.调用接口
int main(){
CA* pA = new CA ;
// Get an IX pointer.
IX* pIX = pA ;
pIX->Fx1() ;
pIX->Fx2() ;
delete pA ;
return 0 ;
}
到目前为止,跟com组件根本搭不上边.我们且称这是一个组件(中间件,类库…)都可以.
五.虚拟函数表vtbl(virtual function table)
1.虽然com接口号称语言,无关性,为何我们还是选择c++作为编写的语言,而不是c#或者java?2.c++抽象基类怎么说成是com接口?
我们先重新来看那段接口的代码.interface IX
{
virtual void __stdcall Fx1() = 0 ;
virtual void __stdcall Fx2() = 0 ;
} ;
又是概念
当定义了一个抽象基类,也就定义了相应的内存结构,派生类实现了该抽象类才会被分配.
虚拟函数表包含一组指向虚拟函数实现的指针.
以上可以不管.下面的话才是重要的.
似乎是偶然的巧合,com接口的内存结构同c++编译器为抽象基类等所生成的内存结构是相同的。。。
由于这个巧合,IX即是接口,又是抽象基类。
由于这个巧合,我们就选择了c++,就像阿里的招聘广告 If not you,who?
六.关于类,接口,组件的一些简单理论概念
1.类非组件组件这一称法太过专业,可以当作一个功能模块,按我的理解可以一个控件也是一个组件,如DataGrid是一个组件,DataGrid是由n多类组成一个功能强大的控件,所以类非组件. 话说话来,简单的组件也可以由一个类组成。概念而已,无需理会.不知道也不会怎么样…
2.接口与类的继承关系
一个类可以继承多个接口实现,也可以由一个接口一个类实现…
3.多重接口继承
即多个类继承相同接口(可以是多个接口),不同实现…
4.命名冲突
怎么办?改名…要是遇到别人骚扰你,你改名,他也改名就没办法了...
好了,先写到这里.这篇其实与com组件基本无关的.
相关文章推荐
- com学习笔记(1)基础接口的定义
- 定义Retrofit 网络接口服务的包装类(基础类)
- [Asp.net 5] Configuration-新一代的配置文件(接口定义与基础实现)
- PHP基础之预定义接口1——Traversable接口
- [基础题]8.(*)按如下要求编写Java程序:(1)定义一个交通工具收费接口Charge
- PHP基础之预定义接口2——Iterator接口
- Java_语法基础_定义规范的接口类型
- .NET基础类库中的若干预定义接口
- PHP基础之预定义接口3——IteratorAggregate接口
- C#的接口基础教程之二 定义接口
- PHP基础之预定义接口4——ArrayAccess接口
- iPhone开发之object c基础一定义接口
- C#的接口基础教程之三 定义接口成员
- PHP基础之预定义接口5——Serializable接口
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
- Selenium自动化测试从入门到精通(基础操作、架构设计、定义接口、日志处理、脚本导出)
- iphone开发之object c基础一定义接口
- 定义一个接口,再定义类实现该接口,编写应用程序,调用接口中的 3 个方法,并将调用方法所得的结果输出。
- java基础第六天_接口与适配器模式、多态、内部类
- PHP基础之预定义异常