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

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

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

Подскажите, можно ли как то сделать "красивее". существует текстовый формат. каждая строка это одна запись. У каждой записи разный набор параметров. Есть как текстовые (порядковый номер,имя,ид,и т.д.) Геометрические Круг/квадрат/и т.д. (количество вершин, координаты, точность, айдишники) Абстрактные объекты (ид, имя, свойства всякеие). в общей совокупности всего видов записи десятка полтора. Некоторые их параметры совпадают, некоторые нет(чаще нет). Абстрактные штуки могут содержать в себе произвольное количество геометрических и других абстрактных штук Изначально парсил все это в словарь словарей, где ключ значение, постоянная конвертация параметров из текстовых в числовые и обратно. Плюс обязательные проверки на наличие параметра (некоторые при пустых значениях вовсе не пишутся). Решил переписать под компановщик.
    public abstract class RowObject
    {
        public void Add(RowObject rowObject)
        {
            throw new NotImplementedException();
        }
 
        public void Remove(RowObject rowObject)
        {
            throw new NotImplementedException();
        }
 
        public void GetChild(int i)
        {
            throw new NotImplementedException();
        }
    }
от него наследую уже и создаю что то типа
    public class TextRow: RowObject
    {
        public string Lib { get; set; }
        public string Description { get; set; }
        public int DisplayMode { get; set; }
        public int OwnerPartId { get; set; }
        public Point Location { get; set; }
        public Boolean IsMirrored { get; set; }
        public string SourceName { get; set; }
        public string TargetName { get; set; }
        public string Id { get; set; }
        public Color AreaColor { get; set; }
        public string DesignitemId { get; set; }
    }
 
    public class Line: RowObject
    {
        public string Lib { get; set; }
        public string Description { get; set; }
        public int LineWidth { get; set; }
        public int OwnerId { get; set; }
        public string Id { get; set; }
        public Point[] Locations { get; set; }
    }
которые будут за абстрактные объекты отвечать, там будет перегружены Remove/Add/GetChild Можно ли как то красиво где то собрать свойства, и только в нужных объектах их инициализировать? Думал о декораторе, но мне не нравится такой вариант, излишне получается.

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

textual
Листинг программы
  
class MainApp
  {
    static void Main()
    {
      // Create a tree structure
      Composite root = new Composite("root");
 
      root.Add(new Leaf("Leaf A"));
      root.Add(new Leaf("Leaf B"));
 
      Composite comp = new Composite("Composite X");
 
      comp.Add(new Leaf("Leaf XA"));
      comp.Add(new Leaf("Leaf XB"));
      root.Add(comp);
      root.Add(new Leaf("Leaf C"));
 
      // Add and remove a leaf
      Leaf leaf = new Leaf("Leaf D");
      root.Add(leaf);
      root.Remove(leaf);
 
      // Recursively display tree
      root.Display(1);
 
      // Wait for user
      Console.Read();
    }
  }
 
  /// <summary>
  /// Component - компонент
  /// </summary>
  /// <li>
  /// <lu>объявляет интерфейс для компонуемых объектов;</lu>
  /// <lu>предоставляет подходящую реализацию операций по умолчанию,
  /// общую для всех классов;</lu>
  /// <lu>объявляет интерфейс для доступа к потомкам и управлению ими;</lu>
  /// <lu>определяет интерфейс доступа к родителю компонента в рекурсивной структуре
  /// и при необходимости реализует его. Описанная возможность необязательна;</lu>
  /// </li>
  abstract class Component
  {
    protected string name;
 
    // Constructor
    public Component(string name)
    {
      this.name = name;
    }
 
    public abstract void Display(int depth);
  }
 
  /// <summary>
  /// Composite - составной объект
  /// </summary>
  /// <li>
  /// <lu>определяет поведеление компонентов, у которых есть потомки;</lu>
  /// <lu>хранит компоненты-потомоки;</lu>
  /// <lu>реализует относящиеся к управлению потомками операции и интерфейсе
  /// класса <see cref="Component"/></lu>
  /// </li>
  class Composite : Component
  {
    private List<Component> children = new List<Component>();
 
    // Constructor
    public Composite(string name) : base(name)
    {  
    }
 
    public void Add(Component component)
    {
      children.Add(component);
    }
 
    public void Remove(Component component)
    {
      children.Remove(component);
    }
 
    public override void Display(int depth)
    {
      Console.WriteLine(new String('-', depth) + name);
 
      // Recursively display child nodes
      foreach (Component component in children)
      {
        component.Display(depth + 2);
      }
    }
  }
 
  /// <summary>
  /// Leaf - лист
  /// </summary>
  /// <remarks>
  /// <li>
  /// <lu>представляет листовой узел композиции и не имеет потомков;</lu>
  /// <lu>определяет поведение примитивных объектов в композиции;</lu>
  /// </li>
  /// </remarks>
  class Leaf : Component
  {
    // Constructor
    public Leaf(string name) : base(name)
    {  
    }
 
    public override void Display(int depth)
    {
      Console.WriteLine(new String('-', depth) + name);
    }
  }

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


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

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

8   голосов , оценка 3.875 из 5
Похожие ответы