假设我有一个提供一些默认构造函数功能的通用抽象类,因此您不必在继承的类中重复代码:
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);
}
}
现在的问题是,当我编写两个继承的类时:
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) {}
}
如您所见,这两个确实是类型安全的枚举。它们只提供预定义的值,不能为任何其他目的实例化。
问题
问题是因为这两个继承的类都使用与基类相同的泛型类型,即Base<string, string>
. 泛型类和静态字段的工作方式是为每个泛型类型(或多个泛型类型的组合)创建一个新的静态字段。
在我的情况下,string, string
这就是为什么只有一个基类静态字段并且它包含 4 个值而不是两个静态字段,每个字段都有 2 个值的原因。
我如何克服这个问题并将它们分开,同时仍然将此功能保留在基类中,这样我就不会重复我的代码?
将字段从静态更改为实例是行不通的,因为我最终会得到 4 个实例,每个实例只包含一个值......