ООП модель данных, Компоновщик - C#
Формулировка задачи:
Подскажите, можно ли как то сделать "красивее".
существует текстовый формат. каждая строка это одна запись.
У каждой записи разный набор параметров.
Есть как текстовые (порядковый номер,имя,ид,и т.д.)
Геометрические Круг/квадрат/и т.д. (количество вершин, координаты, точность, айдишники)
Абстрактные объекты (ид, имя, свойства всякеие).
в общей совокупности всего видов записи десятка полтора. Некоторые их параметры совпадают, некоторые нет(чаще нет). Абстрактные штуки могут содержать в себе произвольное количество геометрических и других абстрактных штук
Изначально парсил все это в словарь словарей, где ключ значение, постоянная конвертация параметров из текстовых в числовые и обратно. Плюс обязательные проверки на наличие параметра (некоторые при пустых значениях вовсе не пишутся).
Решил переписать под компановщик.
от него наследую уже и создаю что то типа
которые будут за абстрактные объекты отвечать, там будет перегружены Remove/Add/GetChild
Можно ли как то красиво где то собрать свойства, и только в нужных объектах их инициализировать? Думал о декораторе, но мне не нравится такой вариант, излишне получается.
Листинг программы
- 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; }
- }
Решение задачи: «ООП модель данных, Компоновщик»
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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д