0

我正在创建一个基类Node,它基本上包装了我正在为其编写插件的程序中的另一个类的实例BaseAppObject。Node 的属性和Node的任何派生通过BaseAppObject.SetUserString(key,value)BaseAppObject.GetUserString(key,value)两种方法将它们的属性存储在BaseAppObject中。

有两种情况我需要实例化一个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);
            }
    }
}

从Node派生的其他类可能会添加类似这样的附加属性。

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

2 回答 2

1

You might want to consider Factory Methods as a solution to your problem.

于 2009-06-09T20:25:27.213 回答
0

There's no way to force subclasses to create two constructors. Documentation and code reviews are useful, but not foolproof. Otherwise, you might have to add checks in the constructor to ensure that the "CPName" property is set if the reinitialize constructor is called and throw an exception if it's not. Alternately, you can do a Debug.Assert instead of throwing an exception.

于 2009-06-09T19:22:54.313 回答