Re: Коллекции в .NET Framework Class Library
От: Аноним  
Дата: 30.01.04 15:46
Оценка:
Hi Vlad, I attached source file, could suggest how to fix that problem, please ?
Thx, Dmitry MS

Сценарий:

Создается коллекция объектов типа А (тип А имеет вложенную коллекцию типов B). В конструктор типа А передается коллекция типов B, предопределяя стартовый набор типов B в каждом из объектов А (наследовать смысла нет — слишком раznije объекты). После добавления А в коллекцию над екземпляром А проводятся изменения (вызывается процедура Do, принимающая параметером А). Ета процедура меняет не только А, но также все уже имеущиеся в коллекции ехемпляри А, как будто бы ето к ним относится.

Есть идея, что это поведение обусловлено фактом передачи в конструктор А мастер коллекции, которая всегда передается по ссилке (disregard of ByVal or ByRef). Таким образом, все созданние екземпляры А имеют не независимие коллекции типов B, а ссылку на одну такую коллекцию, заданную при их создании.

Вопрос:
Как ограничить область применения преобразований над А — конкретним екземпляром, передаваемым в процедуру Ду.

Спасибо.

P.S. Source.


namespace Refs
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(232, 128);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(688, 365);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            Master m = new Master();
            m.PredefinedFieldSet.Add(new Field("MyPredefinedField"));

            Detail d;

            //adds 10 detial items into master
            for (int i =0; i < 10; i++) {
                d = new Detail(m.PredefinedFieldSet);
                m.Details.Add(d);
            }

            //assign values to detail items (expected from 1 to 10)
            m.AssignValues();
            
            foreach (Detail d2 in m.Details) {
                MessageBox.Show(d2.DerivedSet[0].Value.ToString());
            }
        }
    }

    
    
    //classes

    //Field
    public class Field 
    {
        
        private int _someValue;
        private string _name;
        
        public Field(string Name) 
        {
            _name = Name;
        }

        public int Value 
        {
            get 
            {
                return _someValue;
            }
            set 
            {
                _someValue = value;
            }
        }

        public string Name 
        {
            get 
            {
                return _name;
            }
            set 
            {
                _name = value;
            }
        }
    }


    //Fields collection
    public class FieldsCollection: CollectionBase 
    {
        
        public int Add(Field Item)
        {

            return this.List.Add(Item);
        }

        public Field this[int Index] 
        {
            get 
            {
                return (Field) this.List[Index];
            }
        }
    }


    //Master object
    public class Master 
    {
    
        private FieldsCollection _predefinedSet = new FieldsCollection();
        private DetailsCollection _detials = new DetailsCollection();
        int i;

        public FieldsCollection PredefinedFieldSet 
        {
            get 
            {
                return _predefinedSet;
            }
        }
        
        public DetailsCollection Details 
        {
            get 
            {
                return _detials;
            }
        }

        //problem
        public void AssignValues() {
            foreach (Detail d in this.Details) {
                i = i + 1;
                d.DerivedSet[0].Value = i;
            }
        }
        
    }


    //Detial object
    public class Detail 
    {
        
        private FieldsCollection _derivedSet = new FieldsCollection();

        public Detail(FieldsCollection DerivedSet)
        {
            _derivedSet = DerivedSet;
        }

        public FieldsCollection DerivedSet 
        {
            get 
            {
                return _derivedSet;
            }
        }
    }


    //Details collection
    public class DetailsCollection: CollectionBase 
    {
        
        public int Add(Detail Item) 
        {

            return this.List.Add(Item);
        }

        public Detail this[int Index] 
        {
            get 
            {
                return (Detail) this.List[Index];
            }
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.