簡體   English   中英

為包裝器類編寫構造函數的正確方法是什么?

[英]What is the correct way to write a constructor for a wrapper class?

我正在使用.NET API為應用程序編寫插件。 程序的對象可以具有通過根對象類型的兩種方法應用的自定義屬性,該方法將鍵/值對分配給對象。

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

我正在創建一組自己的自定義類,這些類充當BaseAppObject實例的包裝器類。 我所有的類都派生自Node類, Node類具有用於存儲對BaseAppObject的引用的BaseAppObject Node其他屬性以及從Node派生的類型使用關聯的BaseAppObject實例的GetUserStringSetUserString方法直接向關聯的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干凈實例創建我的類的新實例,並且還需要基於存儲在現有BaseAppObject用戶字符串來重新生成我的類的先前存在的實例。

您似乎已經想出了如何重新生成以前存在的類的方法。 要生成沒有值的干凈對象,您所要做的就是提供一個額外的重載,該重載不帶任何參數並創建_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";

我編寫了一個基本包裝器對象,所有包裝器都繼承自該包裝器對象。

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

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

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

我不明白為什么您不希望讓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#中的類型轉換非常棒,您應該利用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM