2013-05-31 52 views
0

今天,我搜索的代碼行其是這樣寫的:如何實現代碼SomeObject.SomeFunction()。SomeOtherFunction();

SomeObject.SomeFunction().SomeOtherFunction(); 

我無法理解這一點。我試圖在谷歌上搜索它,但沒有運氣。

請幫我理解這一點。

+5

即'SomeFunction()'返回其具有方法的對象'someOtherFunction()'。 – NINCOMPOOP

+1

'SomeObject。SomeFunction()只是返回一個具有「SomeOtherFunction」方法的類型的值,沒有什麼特別的。就像你寫了'user.GetFullName()。ToLower將()'。 – Jon

+2

嘗試使用單詞'方法鏈接'搜索 – V4Vendetta

回答

2

考慮以下

public class FirstClass 
{ 
    public SecondClass SomeFunction() 
    { 
     return new SecondClass(); 
    } 
} 

public class SecondClass 
{ 
    public void SomeOtherFunction() 
    { 

    } 
} 

因此,下面是等價的。

FirstClass SomeObject = new FirstClass(); 
SomeObject.SomeFuntion().SomeOtherFunction(); 

OR

FirstClass SomeObject = new FirstClass(); 
SecondClass two = SomeObject.SomeFuntion(); 
two.SomeOtherFunction(); 
+0

太棒了。 。 。 。謝謝你Eoin! – John

+0

完全沒問題。其他答案也是相關的,關於爲Fluent API實現擴展或鏈接方法,但我認爲這是最簡單的OO示例來演示它 –

3

SomeObject有一個叫做SomeFunction()的函數。這個函數根據你的例子返回一個對象(對我們來說是一個未知的類型)。該對象有一個名爲SomeOtherFunction()的函數。

的問題是「如何實現」是一個比較含糊的回答,雖然。

2

這就是所謂的流利編碼或方法鏈,並且是一種編程方法,允許您將命令鏈接在一起。它是在LINQ很常見的,你可能有這樣的事情:

var result = myList.Where(x => x.ID > 5).GroupBy(x => x.Name).Sort().ToList(); 

這將使你的所有記錄大於5,然後按名稱分組,排序,並返回一個列表。相同的代碼可以寫在長手是這樣的:

var result = myList.Where(x => x.ID > 5); 
result = result.GroupBy(x => x.Name); 
result = result.Sort(); 
result = result.ToList(); 

但是你可以看到這是更爲長篇大論。

2

這種編程方式稱爲FluentInterface風格。

例如:

internal class FluentStyle 
    { 
     public FluentStyle ConnectToDb() 
     { 
      // some logic 
      return this; 
     } 
     public FluentStyle FetchData() 
     { 
      // some logic 
      return this; 
     } 
     public FluentStyle BindData() 
     { 
      // some logic 
      return this; 
     } 
     public FluentStyle RefreshData() 
     { 
      // some logic 
      return this; 
     } 
    } 

和對象可以被創建和方法可以消耗如下;

var fluentStyle = new FluentStyle(); 
    fluentStyle.ConnectToDb().FetchData().BindData().RefreshData(); 
+0

最佳答案,告訴你它是什麼,以及如何創建它。 – cjb110

1

這種類型的鏈接的可能涉及擴展方法。這些允許將新方法添加到現有類(即使那些沒有源代碼的類)。

例如

public static class StringExtender 
{ 
    public static string MyMethod1(this string Input) 
    { 
     return ... 
    } 

    public static string MyMethod2(this string Input) 
    { 
     return ... 
    } 
} 

.... 

public string AString = "some string"; 
public string NewString = AString.MyMethod1().MyMethod2(); 
1

這可以通過使用擴展方法

public class FirstClass 
{ 
} 

public class SecondClass 
{ 
} 
public class ThridClass 
{ 
} 

public static class Extensions 
{ 

    public static SecondClass GetSecondClass(this FirstClass f) 
    { 
     return new SecondClass(); 
    } 
    public static ThridClass GetThridClass(this SecondClass s) 
    { 
     return new ThridClass(); 
    } 
} 

}

來完成,然後就可以正餐

 FirstClass f= new FirstClass(); 
     f.GetSecondClass().GetThridClass();