为许多C库强制实施标准接口

时间:2014-04-16 15:32:07

标签: c interface reusability

在OO语言中,我们有办法在多个库中强制实现接口的标准化:

   Interface
      |------Implementation A
      |
      \------Implementation B

我有想做这样的事情:

  Interface.h
      |------Implementation A.c
      |
      \------Implementation B.c

其中Interface.h包含:

  • functionStandard_A()
  • functionStandard_B()

在C中实现这样的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

"界面"在C中可以通过定义struct函数指针来创建。每个"具体实施"将通过此struct的实例呈现自己,初始化其中的函数指针以指向该实现中的函数。

例如,假设创建一个调制解调器驱动程序接口,以便不同的C调制解调器驱动程序具有一组标准功能。我使用调制解调器驱动程序,因为它们是我现在正在处理的应用程序的一个很好的例子。

界面示例:

typedef struct modem_interface
{
    void (*start_call)(void);
    void (*hang_up)(void);
    ...
}

您可能有两个不同的调制解调器驱动程序modem_A.cmodem_B.c,每个驱动程序都有自己的功能来处理呼叫,挂断电话和其他操作。每个驱动程序都创建一个modem_interface实例并对其进行初始化,以便函数指针指向其函数。

例如,在modem_A.c中:

...
modem_interface modem_A_interface;
modem_interface.start_call = &modem_A_start_call; 
...

在应用程序的其他位置,您可能会抓住指向调制解调器A'界面的指针。 struct并在其上调用标准函数("方法"),因为它们最初在modem_interface中定义:

...
modem_A->start_call();
modem_A->hang_up();
...

这样,您可以拥有任意数量的调制解调器驱动程序,但应用程序只需通过modem_interface指针就可以使用它们中的任何一个。例如:

void application_starts_a_call( modem_interface* required_modem )
{
    required_modem->start_call();
    ...
}


// elsewhere:
application_starts_a_call( &modem_A );
application_starts_a_call( &modem_B );

在我冲出门之前快速输入,以便更正。希望它足够好地说明这个概念。