Как уже отмечалось, не переусердствуйте.Я бы объявил абстрактный класс параметров так, чтобы он имел единственный конструктор (защищенный), который принимает обязательные три свойства (Name, IsRequired и ID).Это означает, что каждый конкретный подтип должен правильно его построить.
Тогда у меня будет абстрактный фабричный метод , CreateInstance()
, который должен реализовывать каждый конкретный подтип, возвращая экземпляр AbstractParameter.Зачем?Читайте о принципе замены Лискова .В реальном мире, конечно, может иметь больше смысла, чем использовать фабричный метод , чтобы отделить заботу о том, как создавать экземпляры параметра, от заботы о том, что является параметромПереместив логику построения в собственный фабричный класс (AbstractParameterFactory
?).
Я мог бы заметить, однако, что вам не хватает существенного свойства, которое будут иметь все параметры:ценность.Вы можете сделать базовый класс вашего абстрактного параметра универсальным.
В любом случае, вот мой AbstractParameter
класс:
public abstract class AbstractParameter
{
public string Name { get ; protected set ; }
public bool IsRequired { get ; protected set ; }
public int ID { get ; protected set ; }
protected AbstractParameter( string name , bool isRequired , int id )
{
this.Name = name;
this.IsRequired = isRequired;
this.ID = id;
this.Value = default(T) ;
return;
}
public abstract AbstractParameter CreateInstance( string xml ) ;
}
Конкретный класс параметров, производный от AbstractParameter
, может тогда выглядеть примерно так:это:
public class ConcreteParameter : AbstractParameter
{
public ConcreteParameter( string name , bool isRequired , int id ) : base( name , isRequired , id )
{
return ;
}
public override AbstractParameter CreateInstance( string xml )
{
string name = XmlParser.GetName();
bool required = XmlParser.GetIsRequired();
int id = XmlParser.GetID();
ConcreteParameter instance = new ConcreteParameter( name , required , id );
return instance;
}
}