6

हाय मैं एक समस्या से फंस गया हूं।नेस्टेड ऑब्जेक्ट्स के साथ बिल्डर पैटर्न

मैं अपनी ऑब्जेक्ट्स को आसान बनाने के लिए बिल्डर पैटर्न को कार्यान्वित करना चाहता हूं। मुझे जिस समस्या का सामना करना पड़ता है वह नेस्टेड ऑब्जेक्ट के साथ करना है। जिस ऑब्जेक्ट को मैं बनाना चाहता हूं उसमें अन्य ऑब्जेक्ट्स की एक सूची है, और मुझे वास्तव में इसका समाधान नहीं है कि इसका सामना कैसे किया जाए। ,

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.build(); 

उदाहरण मेरी स्थिति के लिए प्रतिनिधि होना चाहिए, हालांकि अगर अधिक हो गया है: की तरह

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.build(); 

या कुछ:

मैं निम्नलिखित (उदाहरण के लिए सरल वस्तुओं) ऐसा करने में सक्षम होना चाहता हूँ एक प्रकार की नेस्टेड ऑब्जेक्ट से।

+1

क्या 'ReceiptBuilder' नज़र एल के लिए अपने वर्तमान कोड करता है आइक? आइटमों की संरचना क्या है; 'AddItem' के साथ जोड़ने का प्रयास कर रहे हैं? – Jamiec

+0

क्या सामान्य चाल उन घटनाओं से वापसी मूल्य के रूप में खुद को वापस नहीं लौटाती है? तो क्यों नहीं '' ... .ddFoo (नया Foo()। Ingredient ("value") के साथ। टाइप टाइप ("मान"))। ... ''? बस उन उप-प्रकारों के लिए पैटर्न दोहराएं और उप-संग्रह विशिष्ट ऐड-फ़ंक्शंस/गुणों का उपयोग करें। – BitTickler

+0

'रसीद' वर्ग – konkked

उत्तर

6
इस

var rb = new ReceiptBuilder(); 
var receipt = rb.WithName("Name") 
      .WithDate(DateTime.Now) 
      .WithItem("Item1", i => i.WithIngredients("Ingredients1")) 
      .WithItem("Item2", i => i.WithIngredients("Ingredients1")) 
      .Build(); 
Console.WriteLine(receipt); 

तरह

को देखते हुए कोड आपका बिल्डर है बहुत सरल, AddItem बिल्डर विधि के अंदर कुछ सरल विधेय का इस्तेमाल कर रही उपभोक्ता शीर्ष करने के लिए एक समान "बिल्डर" पैटर्न में प्रत्येक आइटम कॉन्फ़िगर करने के लिए अनुमति देने के लिए स्तर ReceiptBuilder:

public class ReceiptBuilder 
{ 
    private Receipt r; 

    public ReceiptBuilder() 
    { 
     r = new Receipt(); 
    } 

    public ReceiptBuilder WithName(string name) 
    { 
     r.Name = name; 
     return this; 
    } 

    public ReceiptBuilder WithDate(DateTime dt) 
    { 
     r.Date = dt; 
     return this; 
    } 

    public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder) 
    { 
     var rib = new ReceiptItemBuilder(text); 
     itemBuilder(rib); 
     r.AddItem(rib.Build()); 
     return this; 
    } 

    public Receipt Build() 
    { 
     return r; 
    } 
} 

public class ReceiptItemBuilder 
{ 
    private ReceiptItem ri; 

    public ReceiptItemBuilder(string text) 
    { 
     ri = new ReceiptItem(text); 
    } 

    public ReceiptItemBuilder WithIngredients(string ings) 
    { 
     ri.Ingredients = ings; 
     return this; 
    } 

    // WithType omitted for brevity. 

    internal ReceiptItem Build() 
    { 
     return ri; 
    } 
} 

कार्य उदाहरण: http://rextester.com/IRR50897

संबंधित मुद्दे