2012-03-30 43 views
5

Tôi có một lớp tùy chỉnh mà tôi sử dụng để xây dựng các chuỗi bảng. Tôi muốn viết lại mã để tôi có thể chuỗi các nhà khai thác. Một cái gì đó như:Làm thế nào để khai báo một lớp trong C# để tôi có thể xâu chuỗi các phương thức?

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

Vì vậy, nó có vẻ như tôi sẽ có mỗi một trong các phương pháp (chức năng) trả lại đối tượng chính vì vậy mà tôi sau đó có thể gọi phương thức khác (chức năng) trên đối tượng hiện ra, nhưng tôi không thể hình làm thế nào để có được aC# class để tham khảo chính nó.

Bất kỳ trợ giúp nào?

Trả lời

6

Vì vậy, bạn sẽ tạo ra một giao diện thông thạo như thế này:

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

Bây giờ bạn có thể sử dụng nó như thế này:

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

này sẽ cung cấp cho bạn một ý tưởng cơ bản về cách bạn cần phải đi về nó. Xem fluent interfaces on wikipedia.

Một cách chính xác hơn để làm điều đó sẽ được thực hiện một giao diện thông thạo:

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 
} 

Và sau đó thực hiện nó: class FluentTable : IFluentTable {}

+0

tất cả các câu trả lời đều tốt, nhưng điều này thực sự vượt xa, Cảm ơn điều này thực sự hữu ích –

7

Sử dụng các từ khóa this như giá trị trả về, như vậy bạn quay trở lại chính nó và bạn có thể chuỗi mãi mãi:

ClassName foo() 
{ 
    return this; 
} 
+0

hey thx landr thx –

0

Hãy chắc chắn rằng mỗi phương thức trả về một giao diện tuyên bố phương pháp mà bạn muốn gọi trên dây chuyền của bạn .

EX công IAdd Thêm()

Bằng cách này nếu IAdd định nghĩa một phương thức add bạn có thể gọi Thêm sau Thêm sau khi Add. Bạn rõ ràng có thể thêm các phương pháp otterh vào cùng một giao diện. Điều này thường được gọi là API thông thạo

+0

Với phương pháp này bạn có thể sử dụng một vài lớp học để thực hiện các chức năng khác nhau của bạn – TGH

3

Điều này sẽ giúp bạn gần gũi.

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

     return this; 
    } 
} 

Chúc may mắn, Tom

7

Ký hiệu này được gọi là Fluent.

Ví dụ của bạn, hình thức đơn giản nhất sẽ là

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

Trong hình thức đẹp hơn, bạn khai báo giao diện (ví dụ, IMyObject) với phương pháp này, và có lớp MyObject thực hiện giao diện đó. Kiểu trả về phải là giao diện, như được minh họa trong ví dụ trên Wikipedia.

Nếu không thể truy cập mã nguồn của lớp, bạn cũng có thể triển khai lớp mở rộng theo cách tương tự.

+2

+1 cho * thông thạo *. –

Các vấn đề liên quan