سؤال

الكود أدناه يتكون من فئتين:

  • Smartform. (فئة نموذجية بسيطة)
  • Smartforms. (فئة الجمع التي تحتوي على مجموعة من Smartform. أشياء)

أريد أن أكون قادرا على إنشاء الفصول المفردة والجمع مثله (أي أنا لا أريد طريقة مصنع GetsMartform ()):

SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");

لتعزيز المنطق، فقط فئة الجمع يجب الوصول إلى قاعدة البيانات. وبعد من الفصل المفرد، عندما يطلب منك إرساء نفسها، ببساطة إنشاء فئة الجمع، ثم اختيار كائن واحد من مجموعة كائن الجمع تصبح هذا الكائن.

كيف يمكنني فعل ذلك؟ حاولت تعيين الكائن ل this الذي لا يعمل.

using System.Collections.Generic;

namespace TestFactory234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForms smartForms = new SmartForms("all");
            SmartForm smartForm = new SmartForm("id = 34");
        }
    }

    public class SmartForm
    {
        private string _loadCode;

        public string IdCode { get; set; }
        public string Title { get; set; }

        public SmartForm() {}

        public SmartForm(string loadCode)
        {
            _loadCode = loadCode;
            SmartForms smartForms = new SmartForms(_loadCode);
            //this = smartForms.Collection[0]; //PSEUDO-CODE
        }

    }

    public class SmartForms
    {
        private string _loadCode;

        public List<SmartForm> _collection = new List<SmartForm>();
        public List<SmartForm> Collection
        {
            get
            {
                return _collection;
            }
        }

        public SmartForms(string loadCode)
        {
            _loadCode = loadCode;
            Load();
        }

        //fills internal collection from data source, based on "load code"
        private void Load()
        {
            switch (_loadCode)
            {
                case "all":
                    SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
                    SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
                    _collection.Add(smartFormA);
                    _collection.Add(smartFormB);
                    _collection.Add(smartFormC);
                    break;
                case "id = 34":
                    SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    _collection.Add(smartForm2);
                    break;
                default:
                    break;
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

لا يلزم أن يكون بالضبط نفس الكائن، فقط يجب أن يبدو أنه هو نفسه للمراقبين الخارجيين. إذا قمت بنسخ جميع البيانات من كائن إلى آخر، فسوف ينجز نفس الشيء.

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}

نصائح أخرى

لا يمكنك الحصول على كائن واحد "لتصبح" آخر.

استخدم الأساليب الثابتة بدلا من الصادرات (وجعل المنشئين خاصين / داخلي / أيا كان ذلك بحيث يمكن فقط الطرق الثابتة الوصول إليها). هناك العديد من الفوائد لاستخدام الطرق الثابتة فوق المنشئ:

  • يمكنك إرجاع null إذا كان ذلك مناسبا
  • يمكنك إرجاع كائن موجود إذا كان ذلك مناسبا
  • يمكنك أن تفعل الكثير من العمل و ومن بعد استدعاء منشئ بسيط الذي يحدد الحقول فقط

الجانب السلبي هو أنها لا تعمل مع C # Collection / Object Initilizers :(

من المقرر أن يكون هناك طريقة بديلة للأساليب الثابتة (التي لا تعمل بشكل جيد مع حقن التبعية، من المقرر أن يكون لها أساليب منفصلة ومثالتها على ذلك.

انت لا تستطيع. مايكروسوفت تفعل ذلك عن طريق تحديد طريقة إنشاء () ثابتة () بدلا من ذلك. انظر على سبيل المثال WebRequest و httpWebRequest في مساحة اسم System.NET. أقترح عليك أن تفعل الشيء نفسه.

اجعل الفئة الأساسية "منشئا داخليا أو خاصا، لذلك لا يمكن إنشاء مثيل لها مباشرة. أو أفضل بعد، اجعلها فئة مجردة. الاستفادة من المصانع المخفية في تنفيذ إنشاء () الخاص بك.

يمكنك استخدام internal أو protected معدل للمشنز، بدلا من public. وبعد مثل ذلك:

public SmartForm() {}
public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

يصبح:

internal SmartForm() {}
internal SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

يمكنك جعل فئة خاصة تسمى SmartFormData, ، ووضع كل القيم فيه.

اعمل ال SmartForms حافظت الطبقة الجمعية على مجموعة من هذه الأشياء، وجعل SmartForm منشئ المفرد العثور على مثيل smartformdata الصحيح في SmartForms جمع.

ثم، جعل جميع الخصائص في SmartForm الجلب المفرد قيمهم من SmartFormData

ومع ذلك، فإن أفضل طريقة للقيام بذلك هي الحصول على منشئ خاص واستخدام طريقة المصنع.

هل هناك سبب يجب عليك استخدام منشئ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top