0

.NET API を使用してアプリケーション用のプラグインを作成しています。プログラムのオブジェクトは、オブジェクトにキーと値のペアを割り当てるルート オブジェクト タイプの 2 つのメソッドを介して適用されるカスタム属性を持つことができます。

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

のインスタンスのラッパー クラスとして機能する独自のカスタム クラスのセットを作成していますBaseAppObjectNode私のすべてのクラスは、への参照を格納するフィールドを持つクラスから派生していBaseAppObjectます。Nodeおよび から派生するのその他のプロパティは、関連付けられたインスタンスのおよびメソッドをNode使用して、関連付けられた との間でプロパティ値を直接読み書きします。GetUserStringSetUserStringBaseAppObjectBaseAppObjects

このようにして、アプリケーションを閉じたときに、後でこれらのラッパー クラスを再生成するために必要なすべての情報が実際のドキュメントに格納されます。

これは、基本クラスのコンストラクター用に用意したものを簡略化したものです。

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

4

3 に答える 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";
于 2009-06-09T04:46:52.590 に答える
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;
    }
}
于 2009-06-09T04:48:32.400 に答える
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#での型キャストは素晴らしく、それを利用する必要があります。

于 2009-06-09T04:49:17.860 に答える