閱讀724 返回首頁    go 阿裏雲 go 技術社區[雲棲]


讓“鏈式調用(方法鏈)”更加自然一點

不論是JavaScript還是C#程序,我們已經習慣了采用如下所示的“鏈式調用”的方式進行編程,這樣確實會使我們的程序變得很精練。

   1: new Foo()
   2:     .UseXxx()
   3:     .UseZzz()
   4:     .UseZzz()
   5:     .Invoke();

采用這種鏈式調用方式的很多方法都是擴展方法,比如上麵所示的UseXxx、UseYyy和UseXxx方法就是采用如下形式定義的擴展方法。

   1: public interface IFoo
   2: {
   3:     void Invoke();
   4: }
   5:  
   6: public class Foo : IFoo
   7: {
   8:     public void Invoke()
   9:     {}
  10:     public void Execute()
  11:     {}
  12: }
  13:  
  14: public static class FooExtensions
  15: {
  16:     public static IFoo UseXxx(this IFoo foo)
  17:     {
  18:         return foo;
  19:     }
  20:     public static IFoo UseYyy(this IFoo foo)
  21:     {
  22:         return foo;
  23:     }
  24:     public static IFoo UseZzz(this IFoo foo)
  25:     {
  26:         return foo;
  27:     }
  28: }

到目前為止,一切都顯得很完美,而且我看到絕大部分的擴展方法也是采用這種方式定義的。但是如果我們希望采用如下的方式調用Foo的方法的,很明顯下麵這樣的代碼是不能通過編譯的。

   1: new Foo()
   2:     .UseXxx()
   3:     .UseZzz()
   4:     .UseZzz()
   5:     .Execute();

我們不得不將這段代碼改寫成如下的形式。改寫的代碼顯得很醜陋,和上麵這段代碼相比較:第一、多聲明了一個變量;第二、將一段很“流暢”的代碼活生生拆分成兩段;第三、在調用Execute方法是添加了一個很“生硬”的類型轉換。

   1: IFoo foo = new Foo()
   2:     .UseXxx()
   3:     .UseYyy()
   4:     .UseZzz();
   5:  
   6: ((Foo)foo).Execute();

如果希望上麵這段代碼合法有效,我們的三個擴展方法應該定一個成如下的形式。

   1: public static class FooExtensions
   2: {
   3:     public static T UseXxx<T>(this T foo) where T: IFoo
   4:     {
   5:         return foo;
   6:     }
   7:     public static T UseYyy<T>(this T foo) where T : IFoo
   8:     {
   9:         return foo;
  10:     }
  11:     public static T UseZzz<T>(this T foo) where T : IFoo
  12:     {
  13:         return foo;
  14:     }
  15: }
作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-25 11:04:09

  上一篇:go  通過重建Hosting係統理解HTTP請求在ASP.NET Core管道中的處理流程[下]:管道是如何構建起來的?
  下一篇:go  【獨家】曠視科技CTO唐文斌專訪:純做技術的公司無法持久