Как правильно написать конструктор для класса-обертки? - PullRequest
0 голосов
/ 09 июня 2009

Я пишу плагин для приложения с .NET API. Объекты программы могут иметь пользовательские атрибуты, применяемые с помощью двух методов типа корневого объекта, которые присваивают объектам пары ключ / значение.

BaseAppObject.GetUserString(string key, string value);
BaseAppObject.SetUserString(string key, ref string value);

Я создаю набор своих собственных пользовательских классов, которые действуют как классы-оболочки для экземпляров BaseAppObject. Все мои классы являются производными от класса Node, который имеет поле для хранения ссылки на BaseAppObject. Другие свойства Node и типы, производные от Node, используют методы GetUserString и SetUserString связанного экземпляра BaseAppObject для чтения или записи значений свойств непосредственно в или из связанного BaseAppObjects.

Таким образом, когда приложение закрывается, вся информация, необходимая для регенерации этих классов-оболочек позже, сохраняется в реальном документе.

Вот упрощенная версия того, что у меня есть для моего конструктора базового класса:

public abstract class Node
{
    BaseAppObject _baseObject;

    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);
            }
    }
}

Другие классы, полученные из Node, могут добавлять дополнительные свойства, подобные этому.

public CustomClass:Node
{
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name)

    public string Color
    {
        get { 
                string name = "";
                this.BaseObject.GetUserString("Color", ref name);
                return name;             
            }

        set {
                this.BaseObject.SetUserString("Color", value);
            }
    }
}

Я пытаюсь найти лучший способ настроить конструкторы и другие методы моих классов для инициации и регенерации экземпляров моих классов. Мне нужно иметь возможность создавать новые экземпляры моих классов на основе clean экземпляров BaseAppObject, для которых не определены пользовательские строки, а также регенерировать ранее существующий экземпляр моего класса на основе пользовательских строк, хранящихся в существующий BaseAppObject.

Ответы [ 3 ]

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

Я написал базовый объект Wrapper, от которого унаследованы все мои оболочки.

public abstract class BaseWrapper<TBaseType> 
    where TBaseType : class
{
    protected readonly TBaseType BaseItem;

    protected BaseWrapper(TBaseType value)
    {
        BaseItem = value;
    }

    public bool IsNotNull()
    {
        return BaseItem != null;
    }
}
1 голос
/ 09 июня 2009

Похоже, вы уже выяснили, как восстановить ранее существующие классы. Чтобы создать чистый объект без значений, все, что вам нужно сделать, это предоставить дополнительную перегрузку, которая не принимает параметров и создает _baseObject. Как только объект создан таким образом, вы можете использовать его свойства для установки значений элементов.

public abstract class Node
{
    BaseAppObject _baseObject;
    //Empty constructor
    public Node() 
    {
        BaseAppObject = new BaseAppObject();
    }
    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
{
    // Empty constructor
    public CustomClass() : Base() {}
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name)

    public string Color
    {
        get { 
                string name = "";
                this.BaseObject.GetUserString("Color", ref name);
                return name;             
            }

        set {
                this.BaseObject.SetUserString("Color", value);
            }
    }
}

Пример кода для создания пустого объекта и его заполнения:

CustomClass node = new CustomClass();
node.Name = "foo";
node.Color = "bar";
0 голосов
/ 09 июня 2009

Я не понимаю, почему вы не хотите сделать Узел дочерним классом BaseClassObj . Если вы пишете класс-оболочку, вы можете использовать функции приведения типов, чтобы ваш класс «Узел» и все его дочерние элементы были напрямую совместимы с BaseClassObj.

Если вы делаете это, вы можете просто сказать

public abstract class Node : BaseAppObject
{

    public Node(string name) : base()
    {            
        this.Name = name;
    } 

    public string Name
    {
        get { 
                string name = "";
                this.GetUserString("CPName", ref name);
                return name;             
            }

        set {
                this.SetUserString("CPName", value);
            }
    }
}

Теперь вы можете использовать объект Node так же, как BaseClassObj, и при этом использовать дополнительную функциональность. Я думаю, что это лучший способ реализовать класс-оболочку. Типизация в C # фантастическая, и вы должны воспользоваться этим.

...