Перегрузка оператора = в С#
От: NeArh  
Дата: 18.07.08 14:27
Оценка:
Такая проблема: есть огромный проект, один из классов которого содержит (помимо всего прочего) массив, назовем его mas. Массив этот доступен через Properties. Есть другой класс изначально изначально содержащий в себе ArrayList (назовем его list) функционально не отличающийся от первого. Решение просится само собой: убрать list и использовать mas. Однако сделать это нужно так, чтобы (в идеале) остальные классы ничего не заметили, ну или на худой конец последствия были минимальны.

Мое решение выглядит так:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace temp
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 cls1 = new Class1();
            Class2 cls2 = new Class2(cls1);
            ArrayList lst=new ArrayList();
            for (int i = 4; i < 10; i++)
                lst.Add(i);
            cls2.mas[3] = 9;                 //В этом случае работает как надо
            cls2.mas = lst;                  //Здесь проблема cls1.mas не изменяется
        }
    }

    class Class1
    {
        private int[] m_mas;

        public Class1()
        {
            m_mas = new int[6];
            for (int i = 0; i < m_mas.Length; i++)
                m_mas[i] = i;            
        }
        public int[] mas
        {
            get
            {
                return m_mas;
            }
            set
            {
                m_mas = value;
            }
        }
    }
    class Class2
    {
        private Container m_Cont;        
        public Class2(Class1 cls)
        {   
            m_Cont=new Container(cls);
        }
        public Container mas
        {
            get
            {                
                return m_Cont;
            }
            set
            {
                m_Cont = value;
            }
        }
    }

    class Container
    {
        private Class1 m_cls1;
        private ArrayList m_list;

        public Container()
        {
            m_list = new ArrayList();
        }
        public Container(Class1 cls)
        {
            m_list = new ArrayList();
            m_cls1 = cls;
            for (int i = 0; i < cls.mas.Length; i++)
                m_list.Add(cls.mas[i]);
        }
        public Container(ArrayList list)
        {
            m_list = list;
        }
      

        public object this[int index]
        {
            set
            {
                m_list[index] = value;
                m_cls1.mas[index] = (int)value;
            }
            get
            {
                return m_list[index];
            }
        }
    }
}

Для решения проблемы неплохо бы было перегрузить оператор =, но я не знаю как.
Если кто подскажет как обрулить вышеуказаную проблему (не обязательно при помощи =) буду очень благодарен
Re: Перегрузка оператора = в С#
От: C...R...a...S...H  
Дата: 18.07.08 17:01
Оценка:
Здравствуйте, NeArh, Вы писали:

NA>Такая проблема: есть огромный проект, один из классов которого содержит (помимо всего прочего) массив, назовем его mas. Массив этот доступен через Properties. Есть другой класс изначально изначально содержащий в себе ArrayList (назовем его list) функционально не отличающийся от первого. Решение просится само собой: убрать list и использовать mas. Однако сделать это нужно так, чтобы (в идеале) остальные классы ничего не заметили, ну или на худой конец последствия были минимальны.


Втыкал, втыкал, что Вы хотете сделать, но думаю такое предложение вам поможет:

class Container
{
    ...
    public static implicit operator Container(ArrayList m)
    {
        return new Container(m);
    }
   
}
Там было написано русским по белому...
Re: Перегрузка оператора = в С#
От: seimur  
Дата: 18.07.08 20:49
Оценка:
Если вы хотите копировать одно в другое, то так легче и не надо использовать явные циклы..


            // Copy all mas elements into m_list.
            m_list.AddRange(mas);

            // Get array.
            mas = (int[])m_list.ToArray(typeof(int));
Теоретически нет разницы между теорией и практикой, но на практике она есть
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.