Как форсировать множественные конструкторы - PullRequest
0 голосов
/ 09 июня 2009

Я создаю базовый класс Узел , который по существу оборачивает экземпляры другого класса из программы, для которой пишу плагин, 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;
}

Ответы [ 2 ]

1 голос
/ 10 июня 2009

Возможно, вы захотите рассмотреть Заводские методы как решение вашей проблемы.

0 голосов
/ 09 июня 2009

Нет способа заставить подклассы создать два конструктора. Документация и обзоры кода полезны, но не надежны. В противном случае вам может понадобиться добавить проверки в конструктор, чтобы убедиться, что свойство «CPName» установлено, если вызывается конструктор повторной инициализации, и выдать исключение, если это не так. Кроме того, вы можете сделать Debug.Assert вместо исключения.

...