ООП модель данных, Компоновщик - 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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д