以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- [转]在C++中使用接口 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=26771) |
-- 作者:vdgame -- 发布时间:1/25/2006 8:51:00 AM -- [转]在C++中使用接口 面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++通过纯虚基类实现接口,譬如COM的C++实现就是通过纯虚基类实现的(当然MFC的COM实现用了嵌套类),但我们更愿意看到一个诸如Interface的东西。下面就介绍一种解决办法。 首先我们需要一些宏: #define Interface class #define DeclareInterface(name) Interface name { public: virtual ~name() {} #define DeclareBasedInterface(name, base) class name : #define EndInterface }; #define implements public DeclareInterface(IBar) 现在我们可以像下面这样来实现我们的接口了: #include "BasicFoo.h" class Foo : public BasicFoo, implements IBar ~Foo(); // IBar implementation virtual void SetBarData(int nData) 如果你仔细观察DeclareInterface 和 DeclareBasedInterfaca宏你会发现有一个操作是必须的:每个接口类都有一个虚析构函数。你可能认为这不重要,但是如果没有这个就可能会导致一些问题,看看下面的例子: DeclareInterface(IBar) class Foo : implements IBar // Construction & Destruction ~Foo() // Helpers if (m_pName != NULL) // IBar implementation virtual void SetName(const char* name) class BarFactory static IBar CreateNewBar(BarType barType) 就像你看到的一样,这里有一个类工厂,它根据BarType来创建一个IBar的实现,当你使用完以后你当然希望要delete该对象,你会像下面这样做: pBar->SetName("MyFooBar"); // and then just delete it when it's no longer needed delete pBar 做了什么取决于该对象是否有一个虚析构函数。如果Foo没有一个虚析构函数,则只有IBar 的隐式的空析构函数被调用,Foo的析构函数不会被调用,这样就发生了内存泄露。接口类里虚析构函数的声明避免了这用状况,它确保每个实现接口的类都有一个虚析构函数。 当你使用DeclareInterfac的时候,记得使用EndInterface和它匹配。Interface 宏和 implements宏仅仅是代替了class和public,这看起来是多余的,但我认为它们更明确的表达了代码的意图。如果我这么写:class Foo : public IBar,你可能认为这只是一个简单的继承;但如果我这么写:class Foo: implements IBar,你就会看到它实际的价值和意图---这是对一个接口的实现,而不是简单的一次继承。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
46.875ms |