C语言中没有任何语法技巧来实现方法链接,这可能与其他一些语言中使用的方法相同。在C中,你会写分开的函数调用,传递对象指针到每个功能:
Widget *w = getWidget();
widgetSetWidth(w, 640);
widgetSetHeight(w, 480);
widgetSetTitle(w, "Sample widget");
widgetSetPosition(w, 0, 0);
同样可以完成与方法在C++调用和其它OOP语言:
Widget *w = getWidget();
w->SetWidth(640);
w->SetHeight(480);
w->SetTitle("Sample widget");
w->SetPosition(0, 0);
利用上述API和假设每个方法返回this
对象,链接语法该方法是这样的:
getWidget()->SetWidth(640)->SetHeight(480)->SetTitle("Sample widget")->SetPosition(0, 0);
这是否是比分隔符更易读e声明是品味和本地编码惯例的问题。我个人觉得它很麻烦,很难阅读。代码生成方面有一个小优点:对象指针不需要从下一次调用的本地变量中重新加载。这种微小的优化很难证明链式语法的正确性。
一些程序员试图使它更可口这样:
getWidget()
-> SetWidth(640)
-> SetHeight(480)
-> SetTitle("Sample widget")
-> SetPosition(0, 0);
再次,口味和编码规范的问题......但C相当于肯定看起来别扭:
Widget *w = widgetSetPosition(widgetSetTitle(widgetSetHeight(widgetSetWidth(getWidget(), 640), 480), "Sample widget"), 0, 0);
而且没有简单的方法将这个链条重新组织成更具可读性的链条。
需要注意的是一些最ANCIEN C库函数可得链接:
const char *hello = "Hello";
const char *world = "World";
char buf[200];
strcpy(buf, hello);
strcat(buf, " ");
strcat(buf, world);
strcat(buf, "\n");
可改组为:
strcat(strcat(strcat(strcpy(buf, hello), " "), world), "\n");
但更安全,多首选的方法是这样的:
snprintf(buf, sizeof buf, "%s %s\n", hello, world);
欲了解更多信息,你可能要阅读:
Marco Pivetta (Ocramius): Fluent Interfaces are Evil
还要注意的是,如果C的对象具有用于这些调用函数指针构件,上述所有的语法可以使用,但对象指针必须仍然作为参数传递。函数指针通常在到其上的指针被存储在对象中的结构组合,模仿的C++虚拟方法的实现,使得语法稍重:
Widget *w = getWidget();
w->m->SetWidth(w, 640);
w->m->SetHeight(w, 480);
w->m->SetTitle(w, "Sample widget");
w->m->SetPosition(w, 0, 0);
链接这些也是可能的,但对于没有真正的获得。
不是。流体接口通常只存在于OO语言中。 – Barmar
这在C中没有多大用处,原因有二:一,没有例外。返回值通常用于指示成功或失败。二,手动内存管理,没有RAII。 – EOF
C没有方法。它有功能。你的问题没有意义。 – EJP