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];
}
}
}
}