2

C# プログラムには、そのクラスのすべてのインスタンスの辞書コレクションである静的メンバーを含む一連のクラスがあります。次のようなものです。

class A
{
  private static Dictionary<int,A> dict = new Dictionary<int, A>();
  public static A GetInstance(int handle) { return dict[handle];}

  public A(int handle) {this._handle = handle; dict[handle] = this;}
  ~A() { dict.Remove(_handle);}
  private int _handle;

}

私はこれを多くのクラスで複製しており、この共通コードを除外したいと考えていますが、これを行う方法がわかりません。具象クラスごとに新しいコレクションが必要なため、プレーンな基本クラスに配置しても機能しません。ジェネリックでそれを行う方法があるに違いないと感じていますが、現時点ではその方法がわかりません。

たとえば、これは正しくありません。

abstract class Base<T>
{
  private static Dictionary<int,T> dict = new Dictionary<int, T>();
  public static T GetInstance(int handle) { return dict[handle];}

  public A(int handle) {this._handle = handle; dict[handle] = this;}
  ~Base() { dict.Remove(_handle);}
  private int _handle;
}

class A : Base<A>
{
}

A のコンストラクターが正しくないため、コンパイルに失敗します。ここでトリックがありませんか?

4

1 に答える 1

2

IDisposableこれは、インターフェイスの実装を使用した私のバリアントです。

class Base<T> : IDisposable
    where T : Base<T>, new()
{
    private static Dictionary<int, T> dict = new Dictionary<int, T>();
    private static T Get(int handle)
    {
        if (!dict.ContainsKey(handle))
            dict[handle] = new T(); //or throw an exception
        return dict[handle];
    }
    private static bool Remove(int handle)
    {
        return dict.Remove(handle);
    }

    public static T GetInstance(int handle)
    {
        T t = Base<T>.Get(handle);
        t._handle = handle;
        return t;
    }

    protected int _handle;

    protected Base() { }

    public void Dispose()
    {
        Base<T>.Remove(this._handle);
    }
}

class A : Base<A> { }

そしてそれを使用します:

using (A a = Base<A>.GetInstance(1))
{

}

publicここでは、 から派生するクラスのコンストラクターはありませんBase<T>。インスタンスの作成には静的ファクトリGetInstanceメソッドを使用する必要があります。Disposeメソッドが呼び出されたときにのみインスタンスがディクショナリから削除されることに注意してください。そのため、usingステートメントをDispose使用するか、手動で呼び出す必要があります。

ただし、SLaks によるコメントを考慮する必要があると思います。

于 2013-01-21T01:36:51.337 に答える