ООП модель данных, Компоновщик - 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);
}
}