2012-03-30 6 views
5

Ich habe eine benutzerdefinierte Klasse, die ich zum Erstellen von Tabellenzeichenfolgen verwenden. Ich möchte den Code neu schreiben, damit ich die Operatoren verketten kann. Etwas wie:Wie deklariere ich eine Klasse in C#, damit ich Methoden verketten kann?

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

So scheint es, wie ich jede dieser Methoden (Funktionen) haben würde sich das Objekt zurück, so dass ich dann eine andere Methode (Funktion) auf das resultierende Objekt aufrufen kann, aber ich kann nicht verstehen heraus, wie man aC# -Klasse auf sich selbst beziehen kann.

Irgendwelche Hilfe?

Antwort

6

So würden Sie eine fließend Schnittstelle wie folgt erstellen:

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(); 
    } 
} 

Nun könnte man es wie folgt verwenden:

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

Dies sollte Ihnen eine grundlegende Vorstellung davon, wie Sie über gehen müssen es. Siehe fluent interfaces on wikipedia.

Ein richtiger Weg, es zu tun, um implementieren eine fließend Schnittstelle wäre:

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 
} 

Und dann umzusetzen: class FluentTable : IFluentTable {}

+0

alle Antworten waren gut, aber diese geht wirklich darüber hinaus, Danke das war wirklich hilfreich –

7

Verwenden Sie das this Stichwort als Rückgabewert, dass die Art und Weise Sie sich zurück, und Sie können Kette für immer:

ClassName foo() 
{ 
    return this; 
} 
+0

hey thx landr thx –

0

Stellen Sie sicher, dass jede Methode eine Schnittstelle zurückgibt, die Methoden erklärt, die Sie auf Ihre Kette anrufen möchten .

EX öffentlichen Iadd Add()

diese Weise, wenn Iadd ein Add-Methode definiert, die Sie nach dem Hinzufügen Hinzufügen aufrufen können abgeben. Sie können natürlich auch andere Methoden zu derselben Schnittstelle hinzufügen. Dies wird in der Regel eine fließende API genannt

+0

Mit diesem Ansatz Sie mehrere Klassen verwenden können um Ihre verschiedenen Funktionen zu implementieren – TGH

3

Dies sollte Sie in die Nähe kommen.

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

     return this; 
    } 
} 

Viel Glück, Tom

7

Diese Notation wird Fluent genannt.

Für Ihr Beispiel ist die einfachste Form

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

In der schöneren Form sein würde, erklären Sie Schnittstellen (zum Beispiel IMyObject) mit diesen Verfahren und haben die MyObject-Klasse, die eine Schnittstelle implementieren. Der Rückgabetyp muss die Schnittstelle sein, wie im obigen Wikipedia-Beispiel dargestellt.

Wenn auf den Quellcode der Klasse nicht zugegriffen werden kann, können Sie auf ähnliche Weise auch eine Erweiterungsklasse implementieren.

+2

+1 für * fließend *. –

Verwandte Themen