[英]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
實例的GetUserString
和SetUserString
方法直接向關聯的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.