在OO语言中,我们有办法在多个库中强制实现接口的标准化:
Interface
|------Implementation A
|
\------Implementation B
我有想做这样的事情:
Interface.h
|------Implementation A.c
|
\------Implementation B.c
其中Interface.h包含:
functionStandard_A()
functionStandard_B()
在C中实现这样的最佳做法是什么?
答案 0 :(得分:2)
"界面"在C中可以通过定义struct
函数指针来创建。每个"具体实施"将通过此struct
的实例呈现自己,初始化其中的函数指针以指向该实现中的函数。
例如,假设创建一个调制解调器驱动程序接口,以便不同的C调制解调器驱动程序具有一组标准功能。我使用调制解调器驱动程序,因为它们是我现在正在处理的应用程序的一个很好的例子。
界面示例:
typedef struct modem_interface
{
void (*start_call)(void);
void (*hang_up)(void);
...
}
您可能有两个不同的调制解调器驱动程序modem_A.c
和modem_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 );
在我冲出门之前快速输入,以便更正。希望它足够好地说明这个概念。