継承されたクラスでコードを繰り返す必要がないように、デフォルトのコンストラクター機能を提供するジェネリック抽象クラスがあるとします。
public abstract class Base<TKey, TValue>
{
private static readonly IDictionary<TKey, Base<TKey, TValue>> Values = new Dictionary<TKey, Base<TKey, TValue>>();
public TKey Key { get; private set; }
public TValue Value { get; private set; }
protected Base(TKey key, TValue value)
{
this.Key = key;
this.Value = value;
Values.Add(key, this);
}
}
問題は、次のような 2 つの継承されたクラスを作成する場合です。
public sealed class One : Base<string, string>
{
public static readonly One Default = new One("DEF", "Default value");
public static readonly One Invalid = new One("", "Invalid value");
private One(string key, string value) : base(key, value) {}
}
public sealed class Two : Base<string, string>
{
public static readonly Two EU = new Two("EU", "European Union");
public static readonly Two USA = new Two("", "United States of America");
private Two(string key, string value) : base(key, value) {}
}
ご覧のとおり、これら 2 つはタイプ セーフな列挙型です。定義済みの値のみを提供し、他の目的でインスタンス化することはできません。
質問
問題は、これらの継承されたクラスの両方が、基本クラスである同じジェネリック型を使用しているためですBase<string, string>
。また、ジェネリック クラスと静的フィールドが機能する方法は、ジェネリック型 (または複数の場合は組み合わせ) ごとに新しい静的フィールドが作成されることです。
私の場合、組み合わせは、基本クラスの静的フィールドが1つstring, string
しかなく、それぞれ2つの値を持つ2つの静的フィールドではなく、4つの値を保持する理由です。
コードを繰り返さないように、基本クラスでこの機能を維持しながら、この問題を克服してそれらを分離するにはどうすればよいですか?
フィールドを静的からインスタンスに変更しても機能しません。それぞれが 1 つの値しか保持しない 4 つのインスタンスになってしまうためです...