浅析C++接口实现方法

开发 后端
所谓接口:我试图要使用一个功能,但是我不确定这个功能是如何实现的时,我所调用的一个函数指针,或者一个虚函数,或者一个纯虚类。

C++接口总是空的,或者虚的,C++接口和C++抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现,它不实现任何东西,所以可以有以下的结论:

定理1:C++接口是依赖的终点。接口不需要依赖任何东西。

推论1:依赖C++接口是安全的。不会带来更多的依赖关系。

推论2:当我们需要依赖时,我们必须尽量做到:我们依赖的是接口。而不是实际的东西。

前面的WNS的例子中,是函数指针接口的应用。下面举出一个纯虚类的例子。

假设我们制作了一个对话框(MyDlg)。我在对话框上添加了一个控件(MyCtrl)。MyCtrl派生于一个基类MyCtrlBase,该Base类有一个虚函数:

  1. virtual void OnClick() = 0; 

该控件被点击的时候,则OnClick会被调用。现在的意图是,该控件被点击的时候,我的对话框发生某种变化,比如说,MyDlg::OnMyCtrlClick()被调用。这如何实现呢? 最常见的但是也是错误的方法如下首先是MyDlg:

  1. class MyDlg : public MyDlgBase   
  2. {   
  3. public virtual void OnMyCtrlClick()   
  4. { … }   
  5. private: MyCtrl * m_myCtrl;   
  6.  class MyCtrl : public MyCtrlBase   
  7. { public: virtual void OnClick();   
  8. private:   
  9. MyDlgCtrl *m_parentDlg; };  

我确实实现了。但是这个实现方法真的很愚蠢。因为MyCtrl和MyDlg完全依赖了对方。任何一个都不能脱离对方而被重用。MyDlg依赖MyCtrl尚可以理解。因为这个对话框中含有这个控件。但是MyCtrl为何要依赖MyDlg呢?这是完全没有必要的。我自己是一个控件,没有理由理会我在哪个窗口里。

无论在哪个窗口里,都是一样的作用。 当对话框上有多个不同控件时,情况会更加复杂。最终的结果,导致全部的组件之间都互相依赖,没有任何一个部分是可以重用的。 正确的方法是抽象出一个接口。这个C++接口叫做“点击接收者”。#t#

下面再举我们在Capsuit的开发中,碰到的一个问题。情况是这样的:我们的软件,要对计算机进行全面的检查。包括检查硬件,检查操作系统信息,检查注册表,检查进程,以及运行的服务等等,来判断当前计算机是否正常。

本人负责开发检查部分。这个部分的任务是,根据外部输入的需求,来调用相应的实际进行检查的函数。这些函数则由各个不同部门的同仁实现好。本人只要调用他们就可以了。

  1. struct condition { string check_type; // 告诉我检查的类型, string param1; 
  2. // 检查的参数,比如说是哪个注册表项要检查,等等 string param2; 
  3. // 同上,都是取决于不同类型的检查而不同的参数 };  
责任编辑:chenqingxiang 来源: 新浪科技
相关推荐

2010-01-14 17:13:53

C++接口

2014-01-02 10:46:35

PostgreSQLC++

2010-01-18 14:41:52

Visual C++开

2010-01-22 13:59:34

Visual C++应

2009-07-06 17:36:06

ResultSetJDBC Connec

2009-09-01 18:29:24

C#实现多个接口

2009-08-31 16:48:02

C#实现IDispos

2010-01-26 17:35:09

C++栈

2020-09-03 08:09:15

C++接口语言

2010-01-27 16:05:06

C++堆栈

2010-01-21 09:34:57

C++语法

2009-08-27 18:09:49

C#接口的实现

2009-08-27 14:29:28

显式实现接口

2009-09-07 09:36:29

C# DisposeDispose方法

2010-01-20 10:19:55

C++数组

2010-01-27 17:16:52

C++构造函数

2017-08-22 16:40:22

前端JavaScript接口

2010-02-03 10:50:33

C++多态

2010-02-03 16:35:45

C++回文

2021-10-19 14:04:28

C++类型数字
点赞
收藏

51CTO技术栈公众号