Абстрактная заводская шаблон дизайнаC#

Место общения программистов C#
Ответить
Anonymous
 Абстрактная заводская шаблон дизайна

Сообщение Anonymous »

Я работаю над внутренним проектом для моей компании, и часть проекта заключается в том, чтобы иметь возможность проанализировать различные «задачи» из файла XML в коллекцию задач, которые будут выполняться позже.

Поскольку каждый тип задачи имеет множество различных связанных полей, я решил, что лучше представлять каждый тип задачи с отдельным классом. < /p>

Чтобы сделать это, я построил абстрактный базовый класс: < /p>

public abstract class Task
{
public enum TaskType
{
// Types of Tasks
}

public abstract TaskType Type
{
get;
}

public abstract LoadFromXml(XmlElement task);
public abstract XmlElement CreateXml(XmlDocument currentDoc);
}
< /code>

Каждая задача, унаследованная от этого базового класса, и включал код, необходимый для создания из передачи в Xmlelement, а также сериализовать себя обратно на XMlelement. < / p>

Основной пример: < /p>

public class MergeTask : Task
{

public override TaskType Type
{
get { return TaskType.Merge; }
}

// Lots of Properties / Methods for this Task

public MergeTask (XmlElement elem)
{
this.LoadFromXml(elem);
}

public override LoadFromXml(XmlElement task)
{
// Populates this Task from the Xml.
}

public override XmlElement CreateXml(XmlDocument currentDoc)
{
// Serializes this class back to xml.
}
}
< /code>

Затем анализатор будет использовать код, аналогичный этому для создания коллекции задач: < /p>

XmlNode taskNode = parent.SelectNode("tasks");

TaskFactory tf = new TaskFactory();

foreach (XmlNode task in taskNode.ChildNodes)
{
// Since XmlComments etc will show up
if (task is XmlElement)
{
tasks.Add(tf.CreateTask(task as XmlElement));
}
}
< /code>

Все это работает чудесно и позволяет мне выполнять задачи с использованием базового класса, сохраняя при этом структуру наличия отдельных классов для каждой задачи. < /p> < Br />
Однако я не доволен своим кодом для taskfactory.createTask. Этот метод принимает XmleLement, а затем возвращает экземпляр соответствующего класса задач: < /p>

public Task CreateTask(XmlElement elem)
{
if (elem != null)
{
switch(elem.Name)
{
case "merge":
return new MergeTask(elem);
default:
throw new ArgumentException("Invalid Task");
}
}
}
< /code>

Поскольку мне нужно проанализировать Xmlelement, я использую огромный (10-15 случаев в реальном коде), чтобы выбрать, какой класс дочернего класса для создания экземпляра. Я надеюсь, что есть какой -то полиморфный трюк, который я могу сделать здесь, чтобы очистить этот метод. < /P>

Любой совет? < /P>

Подробнее здесь: https://stackoverflow.com/questions/272 ... gn-pattern
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»