ООП модель данных, Компоновщик - C#

Узнай цену своей работы

Формулировка задачи:

Подскажите, можно ли как то сделать "красивее". существует текстовый формат. каждая строка это одна запись. У каждой записи разный набор параметров. Есть как текстовые (порядковый номер,имя,ид,и т.д.) Геометрические Круг/квадрат/и т.д. (количество вершин, координаты, точность, айдишники) Абстрактные объекты (ид, имя, свойства всякеие). в общей совокупности всего видов записи десятка полтора. Некоторые их параметры совпадают, некоторые нет(чаще нет). Абстрактные штуки могут содержать в себе произвольное количество геометрических и других абстрактных штук Изначально парсил все это в словарь словарей, где ключ значение, постоянная конвертация параметров из текстовых в числовые и обратно. Плюс обязательные проверки на наличие параметра (некоторые при пустых значениях вовсе не пишутся). Решил переписать под компановщик.
Листинг программы
  1. public abstract class RowObject
  2. {
  3. public void Add(RowObject rowObject)
  4. {
  5. throw new NotImplementedException();
  6. }
  7. public void Remove(RowObject rowObject)
  8. {
  9. throw new NotImplementedException();
  10. }
  11. public void GetChild(int i)
  12. {
  13. throw new NotImplementedException();
  14. }
  15. }
от него наследую уже и создаю что то типа
Листинг программы
  1. public class TextRow: RowObject
  2. {
  3. public string Lib { get; set; }
  4. public string Description { get; set; }
  5. public int DisplayMode { get; set; }
  6. public int OwnerPartId { get; set; }
  7. public Point Location { get; set; }
  8. public Boolean IsMirrored { get; set; }
  9. public string SourceName { get; set; }
  10. public string TargetName { get; set; }
  11. public string Id { get; set; }
  12. public Color AreaColor { get; set; }
  13. public string DesignitemId { get; set; }
  14. }
  15. public class Line: RowObject
  16. {
  17. public string Lib { get; set; }
  18. public string Description { get; set; }
  19. public int LineWidth { get; set; }
  20. public int OwnerId { get; set; }
  21. public string Id { get; set; }
  22. public Point[] Locations { get; set; }
  23. }
которые будут за абстрактные объекты отвечать, там будет перегружены Remove/Add/GetChild Можно ли как то красиво где то собрать свойства, и только в нужных объектах их инициализировать? Думал о декораторе, но мне не нравится такой вариант, излишне получается.

Решение задачи: «ООП модель данных, Компоновщик»

textual
Листинг программы
  1.  
  2. class MainApp
  3.   {
  4.     static void Main()
  5.     {
  6.       // Create a tree structure
  7.       Composite root = new Composite("root");
  8.  
  9.       root.Add(new Leaf("Leaf A"));
  10.       root.Add(new Leaf("Leaf B"));
  11.  
  12.       Composite comp = new Composite("Composite X");
  13.  
  14.       comp.Add(new Leaf("Leaf XA"));
  15.       comp.Add(new Leaf("Leaf XB"));
  16.       root.Add(comp);
  17.       root.Add(new Leaf("Leaf C"));
  18.  
  19.       // Add and remove a leaf
  20.       Leaf leaf = new Leaf("Leaf D");
  21.       root.Add(leaf);
  22.       root.Remove(leaf);
  23.  
  24.       // Recursively display tree
  25.       root.Display(1);
  26.  
  27.       // Wait for user
  28.       Console.Read();
  29.     }
  30.   }
  31.  
  32.   /// <summary>
  33.   /// Component - компонент
  34.   /// </summary>
  35.   /// <li>
  36.   /// <lu>объявляет интерфейс для компонуемых объектов;</lu>
  37.   /// <lu>предоставляет подходящую реализацию операций по умолчанию,
  38.   /// общую для всех классов;</lu>
  39.   /// <lu>объявляет интерфейс для доступа к потомкам и управлению ими;</lu>
  40.   /// <lu>определяет интерфейс доступа к родителю компонента в рекурсивной структуре
  41.   /// и при необходимости реализует его. Описанная возможность необязательна;</lu>
  42.   /// </li>
  43.   abstract class Component
  44.   {
  45.     protected string name;
  46.  
  47.     // Constructor
  48.     public Component(string name)
  49.     {
  50.       this.name = name;
  51.     }
  52.  
  53.     public abstract void Display(int depth);
  54.   }
  55.  
  56.   /// <summary>
  57.   /// Composite - составной объект
  58.   /// </summary>
  59.   /// <li>
  60.   /// <lu>определяет поведеление компонентов, у которых есть потомки;</lu>
  61.   /// <lu>хранит компоненты-потомоки;</lu>
  62.   /// <lu>реализует относящиеся к управлению потомками операции и интерфейсе
  63.   /// класса <see cref="Component"/></lu>
  64.   /// </li>
  65.   class Composite : Component
  66.   {
  67.     private List<Component> children = new List<Component>();
  68.  
  69.     // Constructor
  70.     public Composite(string name) : base(name)
  71.     {  
  72.     }
  73.  
  74.     public void Add(Component component)
  75.     {
  76.       children.Add(component);
  77.     }
  78.  
  79.     public void Remove(Component component)
  80.     {
  81.       children.Remove(component);
  82.     }
  83.  
  84.     public override void Display(int depth)
  85.     {
  86.       Console.WriteLine(new String('-', depth) + name);
  87.  
  88.       // Recursively display child nodes
  89.       foreach (Component component in children)
  90.       {
  91.         component.Display(depth + 2);
  92.       }
  93.     }
  94.   }
  95.  
  96.   /// <summary>
  97.   /// Leaf - лист
  98.   /// </summary>
  99.   /// <remarks>
  100.   /// <li>
  101.   /// <lu>представляет листовой узел композиции и не имеет потомков;</lu>
  102.   /// <lu>определяет поведение примитивных объектов в композиции;</lu>
  103.   /// </li>
  104.   /// </remarks>
  105.   class Leaf : Component
  106.   {
  107.     // Constructor
  108.     public Leaf(string name) : base(name)
  109.     {  
  110.     }
  111.  
  112.     public override void Display(int depth)
  113.     {
  114.       Console.WriteLine(new String('-', depth) + name);
  115.     }
  116.   }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы