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