none
Иерархии. RRS feed

  • Вопрос

  • Всем здравствуйте!
    Подскажите пожалуйста, как мне реализовать вот такой объект:

    Объект имеет параметры:Имя,Количество Разделов
    Объект включает в себя массив разделов

    Раздел имеет параметры:Имя,Количество Ключей
    Раздел включает в себя массив ключей

    Ключ имеет параметры:Имя,Значение

    Причем хотелось бы реализовать этот объект таким образом, чтобы он был удобным в эксплуатации, т.е. как я себе представляю: Обращаться к этому объекту надо по средствам интерфейса, можно как прочитать, так и записать в него данные обратившись по имени а не по номеру ячейки в массиве "Var = [Имя Объекта].[Имя Раздела].[Имя Ключа].[Значение]", что то в этом роде. Пробовал релизовать по принципу структура в структуре, но такая конструкция не предоставляет необхлдимого функционала. Подскажите как подступиться к созданию иерархий. Спасибо.

    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 0:32 MSDN Forums consolidation (От:Форум по .NET Framework)

Ответы

  •   public class level1 
      {
        Dictionary<string,level2> dict;
    
        public level1()
        {
          dict = new Dictionary<string,level2>();
        }
        public level2 this[string key]
        {
          get { return dict[key]; }
          set { dict[key] = value; }      
        }
    
        public void AddLevel2(string n)
        {
          dict.Add(n, new level2(n));
        }
      
      }
    
      public class level2
      {
        Dictionary<string, level3> dictlevel2;
        string _name;
        
        public level2(string n)
        {
          _name = n;
          dictlevel2 = new Dictionary<string, level3>();    
        }
    
        public string Level2Name
        {
          get { return _name; }
          set { _name = value; }
        }
        public level3 this[string key]
        {
          get { return dictlevel2[key]; }
          set { dictlevel2[key] = value; }
        }
        public void AddLevel3(string n, string v)
        {
          dictlevel2.Add(n, new level3(n,v));
        }
      }
    
      public class level3
      {
    
        private string _name;
        private string _value;
    
        public level3() : this(String.Empty, String.Empty)
        { 
        }
    
        public level3(string n, string v)
        {
          _name = n;
          _value = v;
        }
    
        public string Level3Name
        {
          get { return _name;}
          set { _name = value; }
        }
    
        public string Level3Value
        {
          get { return _value; }
          set { _value = value; }
        }
    
      }
    
    
    
        private void button1_Click(object sender, EventArgs e)
        {
          level1 l1 = new level1();
          l1.AddLevel2("Кот 1");
          Console.WriteLine(l1["Кот 1"].Level2Name);
          l1["Кот 1"].AddLevel3("Имя", "Вася");
          l1["Кот 1"].AddLevel3("Живет", "в Ангарске");
          Console.WriteLine(l1["Кот 1"]["Имя"].Level3Value);
    
          l1.AddLevel2("Кот 2");
          Console.WriteLine(l1["Кот 2"].Level2Name);
          l1["Кот 2"].AddLevel3("Имя", "Пушог");
          l1["Кот 2"].AddLevel3("Живет", "На помойке");
          l1["Кот 2"].AddLevel3("Окрас", "Серый");
          Console.WriteLine(l1["Кот 2"]["Имя"].Level3Value);
        }
    Это рабочий код. Котов добавляй, сколько хочешь. )))
    • Помечено в качестве ответа JusteG 30 мая 2010 г. 4:13
    Модератор

Все ответы

  • Может с индексерами пойдет?

    Вот такой код

      public class level1 
      {
        Dictionary<string,level2> dict;
    
        public level1()
        {
          dict = new Dictionary<string,level2>();
          dict.Add("Один", new level2());
          dict.Add("Два", new level2());
        }
        public level2 this[string key]
        {
          get { return dict[key]; }
          set { dict[key] = value; }
          
        }
      
      }
    
      public class level2
      {
        Dictionary<string, string> dictlevel2;
        
        public level2()
        { 
          dictlevel2 = new Dictionary<string,string>();
          dictlevel2.Add("Один_Второго_уровня","1");
          dictlevel2.Add("Два_Второго_уровня","2");
    
        
        }
        public string this[string key]
        {
          get { return dictlevel2[key].ToString(); }
          set { dictlevel2[key] = value; }
    
        }
      }

    Дает возможность обращаться к элементам так:

          level1 mc = new level1();
          Console.WriteLine(mc["Один"]["Два_Второго_уровня"]);

    Если нужно именно через точку, то ищи как реализовывать Dynamic Properties.

    В принципе,  вот здесь есть реализация

    Модератор
  • Большое спасибо за полезный пример, неприменно где-нибуль пригодится, но это немного не то что мне нужно. Дело в том что мне нужны именно объекты, дальше список параметров кажного объекта и подобъекта, в т.ч. ключей будет расширятся и код основанный на вашем примере будет уже не актуален. Возможно я погорячился с обращением "через точку" давайте разобьем мой вопрос на 2 подвопроса:

    1. Как сделать иерархическую систему объектов по шаблону:
    Объект Main
    {
     param 1;
     param 2;
     .....
     param n;
     func 1;
     func 2;
     .....
     func n;
     Объект[] Child;
    }
    Объект Child
    {
     param 1;
     param 2;
     .....
     param n;
     func 1;
     func 2;
     .....
     func n;
     Объект[] Key;
    }
    Объект Key
    {
     param 1;
     param 2;
     .....
     param n;
     func 1;
     func 2;
     .....
     func n;
    }
    Причем вложенных подобъектов может быть и больше, дело в том что я хочу понять сам принцип как это реализуется. Как инициализировать такую систему объектов? Какие принципы используются для реализации? Как осущесвляются связи между объектами? Как указать объекту что он не самостоятелен, а лишь компонент другого объекта? Вопросов на самом деле масса, это лишь самые яркие. Просьба объяснить на примере, ну или просто пример, сам буду разбираться...

    2. Как реализовать практичное использование экземляра этой системы.

  • Возвращаясь к "через точку":

    В .Net 4 есть класс ExpandoObject c динамически добавляемыми свойствами(вернее добавляемыми после первого объявления). Методы, в принципе, тоже можно динамически создавать.

    Выглядит его использование примерно так:

     

    dynamic myExpnad = new ExpandoObject(); // Объявили
    myExpnad.propertyName = "propertyValue"; // присвоили и тд
    По ссылке посмотри.

     

    Относительно второго поста:

    Не вижу проблему в использовании в классе массива подклассов.

    Или если нужно все таки добавлять вложенные объекты, то можешь реализовать свой вариант наследуясь от DinamicObject

      public class myclass : DynamicObject
      {
        Dictionary<string, object> s;
        public myclass()
        {
          s = new Dictionary<string, object>();
          s.Add("Odin", "Один");
          s.Add("Dva", "Два");
        }
    
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
          string name = binder.Name;
          return s.TryGetValue(name, out result);
        }
    
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
          s[binder.Name] = value;
          return true;
        }
      }
          dynamic d = new myclass();
          Console.WriteLine(d.Odin);
          d.Tri = "Три";
          Console.WriteLine(d.Tri);

     

    Модератор
  • А как же фукции и параметры? Мне кажется что это не то...

    Мне не нужно по сути добавлять новые параметры на лету, достаточно прдустановленных. Проблема у меня в том чтобы содать объект содержащий массив объектов, вернее даже не создать, а использовать его в дальнейшем, как добавить объект, как удалить...

    Ваш пример безусловно интересен но это не то.

  • Ну напиши

    .AddElement(Element e)

    .DeleteElement(Element e)

    и тд.

    Не понимаю, в чем проблема?

    У тебя фактически стоит задача написать функции для работы с членами класса. Если членами являются массивы  или массивы экземпляров других классов не должно возникать сложностей с тем чтобы использовать члены класса.

    В чем конкретно проблема?

    Давай попробуем начать с начала: ты пишешь "пытаюсь создать ... не получается... как..." или "не знаю как делается ...".

    Модератор
  • Я пытаюсь написать Класс, который содержит массив экземларов второго класса, каждый элемент которого содержит массив экземпларов третьего...

    Вот и вся делема. Я не знаю как это написать, инициализировать и использовать.

    Причем необходимо продумать момент как добовлять и удалять экземпляры по мере необходимости.

  • Вот пример того что я хочу сделать:

    namespace ConsoleApplication1
    {
      class Objects
      {
        static File F = new File();
        public void Inter()
        {
          
        }
        public static void Show(int P, int K)
        {
          F.partition = new Partition[100];
          F.partition[1].key = new Key[100]; //В экземпляре объекта не задана ссылка на объект.
          F.partition[1].key[1].Name = "Вася кот";
          F.partition[1].key[1].Value = "Живет в Ангарске";
          Console.WriteLine("{0} {1}", F.partition[P].key[K].Name, F.partition[P].key[K].Value);
        }
      }
      class Key
      {
        public string Name;
        public string Value;
      }
      class Partition : Key
      {
        public Key[] key;
      }
      class File : Key
      {
        public Partition[] partition;
      }
    }

    Только этот код не работает...

    Вызываю из метода Main строкой Objects.Show(1, 1);

  •   public class level1 
      {
        Dictionary<string,level2> dict;
    
        public level1()
        {
          dict = new Dictionary<string,level2>();
        }
        public level2 this[string key]
        {
          get { return dict[key]; }
          set { dict[key] = value; }      
        }
    
        public void AddLevel2(string n)
        {
          dict.Add(n, new level2(n));
        }
      
      }
    
      public class level2
      {
        Dictionary<string, level3> dictlevel2;
        string _name;
        
        public level2(string n)
        {
          _name = n;
          dictlevel2 = new Dictionary<string, level3>();    
        }
    
        public string Level2Name
        {
          get { return _name; }
          set { _name = value; }
        }
        public level3 this[string key]
        {
          get { return dictlevel2[key]; }
          set { dictlevel2[key] = value; }
        }
        public void AddLevel3(string n, string v)
        {
          dictlevel2.Add(n, new level3(n,v));
        }
      }
    
      public class level3
      {
    
        private string _name;
        private string _value;
    
        public level3() : this(String.Empty, String.Empty)
        { 
        }
    
        public level3(string n, string v)
        {
          _name = n;
          _value = v;
        }
    
        public string Level3Name
        {
          get { return _name;}
          set { _name = value; }
        }
    
        public string Level3Value
        {
          get { return _value; }
          set { _value = value; }
        }
    
      }
    
    
    
        private void button1_Click(object sender, EventArgs e)
        {
          level1 l1 = new level1();
          l1.AddLevel2("Кот 1");
          Console.WriteLine(l1["Кот 1"].Level2Name);
          l1["Кот 1"].AddLevel3("Имя", "Вася");
          l1["Кот 1"].AddLevel3("Живет", "в Ангарске");
          Console.WriteLine(l1["Кот 1"]["Имя"].Level3Value);
    
          l1.AddLevel2("Кот 2");
          Console.WriteLine(l1["Кот 2"].Level2Name);
          l1["Кот 2"].AddLevel3("Имя", "Пушог");
          l1["Кот 2"].AddLevel3("Живет", "На помойке");
          l1["Кот 2"].AddLevel3("Окрас", "Серый");
          Console.WriteLine(l1["Кот 2"]["Имя"].Level3Value);
        }
    Это рабочий код. Котов добавляй, сколько хочешь. )))
    • Помечено в качестве ответа JusteG 30 мая 2010 г. 4:13
    Модератор
  • Спасибо!

    А не подскажешь почему мой код который я привел не работает? Ошибка в коментах...