2012-03-30 16 views
5

Mam niestandardową klasę, której używam do budowania ciągów tabel. Chciałbym przepisać kod, aby móc połączyć operatorów. Coś jak:Jak zadeklarować klasę w języku C#, aby móc łańcuch metod?

myObject 
    .addTableCellwithCheckbox("chkIsStudent", isUnchecked, isWithoutLabel) 
    .addTableCellwithTextbox("tbStudentName", isEditable) etc. 

Wydaje się więc jak bym każdej z tych metod (funkcji) się zwrócić przedmiot tak, że można następnie wywołać inną metodę (funkcja) na uzyskanej obiektu, ale nie mogę zrozumieć jak uzyskać aC# klasy, aby się do siebie odnieść.

Każda pomoc?

Odpowiedz

6

Więc utworzyć biegle interfejs tak:

class FluentTable 
{ 
    //as a dumb example I'm using a list 
    //use whatever structure you need to store your items 
    List<string> myTables = new List<string>(); 

    public FluentTable addTableCellwithCheckbox(string chk, bool isUnchecked, 
                 bool isWithoutLabel) 
    { 
    this.myTables.Add(chk); 
    //store other properties somewhere 
    return this; 
    } 

    public FluentTable addTableCellwithTextbox(string name, bool isEditable) 
    { 
    this.myTables.Add(name); 
    //store other properties somewhere 
    return this; 
    } 
    public static FluentTable New() 
    { 
    return new FluentTable(); 
    } 
} 

Teraz można go używać tak:

FluentTable tbl = FluentTable 
        .New() 
        .addTableCellwithCheckbox("chkIsStudent", true, false) 
        .addTableCellwithTextbox("tbStudentName", false); 

To powinno dać podstawową ideę jak trzeba iść około to. Zobacz fluent interfaces on wikipedia.

Bardziej poprawny sposób to zrobić byłoby wdrożyć biegle interfejs:

interface IFluentTable 
{ 
IFluentTable addTableCellwithCheckbox(string chk, bool isUnchecked, 
                 bool isWithoutLabel) 
IFluentTable addTableCellwithTextbox(string name, bool isEditable) 
//maybe you could add the static factory method New() here also 
} 

a następnie wdrożyć go: class FluentTable : IFluentTable {}

+0

wszystkie odpowiedzi były dobre, ale ten naprawdę wykracza poza, Dzięki to było naprawdę pomocne –

7

Użyj słowa kluczowego this jako wartość zwracana, w ten sposób można zwrócić się i można łańcuch zawsze:

ClassName foo() 
{ 
    return this; 
} 
+0

hej thx landr thx –

0

Upewnij się, że każda metoda zwraca interfejs, który deklaruje metody, które chcesz zadzwonić na łańcuchu .

EX publicznego iadd Dodaj()

ten sposób, jeśli iadd zdefiniowano metodę dodawania można zadzwonić po uprzednim Dodaj po Add. Oczywiście można oczywiście dodawać inne metody do tego samego interfejsu. Nazywa się to płynnie API

+0

Dzięki takiemu podejściu można wykorzystać kilka klas do realizacji różnych funkcji – TGH

3

To powinno Cię przybliżyć.

public class SomeObject 
{ 
    public SomeObject AddTableCellWithCheckbox(string cellName, bool isChecked) 
    { 
     // Do your add. 

     return this; 
    } 
} 

Powodzenia Tom

7

Ten zapis jest nazywany Fluent.

Na swoim przykładzie, najprostszą formą byłoby

public class MyObject { 
    public MyObject addTableCellwithCheckbox(...) { 
     ... 
     return this; 
    } 
    public MyObject addTableCellwithTextbox(...) { 
     ... 
     return this; 
    } 
} 

w bardziej pięknej formie, zadeklarować interfejsów (np IMyObject) z tych metod i mieć klasę MyObject wdrożenia tego interfejsu. Typem zwracanym musi być interfejs, jak pokazano na powyższym przykładzie Wikipedii.

Jeśli kod źródłowy klasy jest niedostępny, można również zaimplementować klasę rozszerzeń w podobny sposób.

+2

+1 za * płynny *. –

Powiązane problemy