为包装类编写构造函数的正确方法是什么?

问题描述 投票:0回答:3

我正在为使用.NET API的应用程序编写插件。程序的对象可以通过根对象类型的两种方法应用自定义属性,这两种方法将键/值对分配给对象。

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

我正在创建一组我自己的自定义类,它们充当围绕BaseAppObject实例的包装类。我的所有类都来自一个类Node,它有一个字段来存储对BaseAppObject的引用。 Node的其他属性和源自Node的类型使用相关GetUserString实例的SetUserStringBaseAppObject方法直接读取或写入相关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);
            }
    }
}

我试图找出设置构造函数和类的其他方法来启动和重新生成类的实例的最佳方法。我需要能够基于没有定义用户字符串的BaseAppObject的干净实例创建我的类的新实例,并且还基于存储在现有BaseAppObject中的用户字符串重新生成我的类的先前现有实例。

c# wrapper
3个回答
1
投票

看起来您已经找到了如何重新生成以前存在的类。要生成没有值的干净对象,您所要做的就是提供一个不带参数的额外重载并创建_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";

1
投票

我已经编写了一个基础包装器对象,我将所有包装器继承自。

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

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

    public bool IsNotNull()
    {
        return BaseItem != null;
    }
}

0
投票

我不明白为什么你不想让Node成为BaseClassObj的子类。如果您正在编写包装类,则可以使用类型转换功能使您的“Node”类及其所有子类直接与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);
            }
    }
}

现在您可以像使用BaseClassObj一样使用Node对象,并且仍然使用其他功能。我认为这是实现包装类的更好方法。 C#中的类型转换很棒,你应该利用它。

© www.soinside.com 2019 - 2024. All rights reserved.