Я создаю базовый класс Узел , который по существу оборачивает экземпляры другого класса из программы, для которой пишу плагин, BaseAppObject . Свойства Node и любые производные Node сохраняют свои свойства в BaseAppObject с помощью двух методов BaseAppObject.SetUserString (ключ, значение) и BaseAppObject.GetUserString (ключ, значение) .
В двух ситуациях мне нужно создать экземпляр Node . Тот, где BaseAppObject чистый, и не имеет пользовательских строк. В этом случае конструктору необходимо передать значения всех свойств для инициации. Второй случай - когда у меня есть BaseAppObject , в котором уже определены пользовательские строки, и я просто хочу обернуть его объектом Node . В этом случае мне нужно только запустить конструктор инициализации, который устанавливает поле _baseObject . Все остальные свойства объекта будут просто считываться из пользовательских строк, установленных в BaseAppObject .
Вот упрощенная версия того, как выглядят мои классы.
public abstract class Node
{
BaseAppObject _baseObject;
//reinitializing constructor
public Node(BaseAppObject baseObject)
{
this._baseObject = baseObject;
}
//initializing constructor
public Node(BaseAppObject baseObject, string name)
{
this._baseObject = baseObject;
this.Name = name;
}
public string Name
{
get {
string name = "";
_baseObject.GetUserString("CPName", ref name);
return name;
}
set {
_baseObject.SetUserString("CPName", value);
}
}
}
Другие классы, полученные из Узел , могут добавлять дополнительные свойства, подобные этому.
public CustomClass:Node
{
//reinitializing constructor
public CustomClass(BaseAppObject baseObj):base(baseObj)
{
}
//initializing constructor
public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name)
{
//here's an additional property added to CustomClass
public string Color
{
get {
string name = "";
this.BaseObject.GetUserString("Color", ref name);
return name;
}
set {
this.BaseObject.SetUserString("Color", value);
}
}
}
Это работает, но позже, если я (или кто-то еще) захочет создать другой класс, производный от Node, они должны понимать, что производный класс должен иметь два конструктора. Один для инициализации, а другой для повторной инициализации.
Есть ли способ сделать эту реализацию встроенной в класс Node? Или тщательная документация - единственный вариант?
Также есть способ избежать размещения одного и того же конструктора с одним аргументом (ниже) в каждом классе, производном от узла.
//reinitializing constructor
public ClassDerivedFromNode(BaseAppObject baseObject)
{
this._baseObject = baseObject;
}