【发布时间】:2009-09-11 01:02:48
【问题描述】:
我正在尝试使用泛型实现identity map。我的实体地图上有一个抽象类、实体和派生约束。由于我的地图需要能够实例化实体,所以我的地图还具有构造函数约束。
但是,为了使地图有用,实体子类不应该能够从客户端代码中实例化,这意味着我需要一个内部构造函数而不需要公共构造函数。但是,这与构造函数约束冲突。
我有什么遗漏吗?有什么方法可以重构它以获得想要的结果吗?
以下代码按原样编译,但理想情况下,Entity 的子类的构造函数是内部的:
public abstract class Entity
{
public int Id { get; protected internal set; }
}
public sealed class Widget : Entity
{
// Client code should not be allowed to instantiate entities.
// But the constraints on EntityMap require that entities have
// a public constructor.
public Widget() { }
}
public sealed class Gadget : Entity
{
public Gadget() { }
}
// The new() constraint is required so that Get() can instantiate Ts.
public class EntityMap<T> where T : Entity, new()
{
private Dictionary<int, T> _entities = new Dictionary<int, T>();
private object _getLock = new object();
public T Get(int id)
{
lock (_getLock)
{
if (!_entities.ContainsKey(id))
_entities.Add(id, new T() { Id = id });
}
return _entities[id];
}
// Client code should not be allowed to instantiate maps.
internal EntityMap() { }
}
// Ideally, the client would only be able to obtain Entity
// references through EntityMaps, which are only accessible
// through the ApplicationMap.
public static class ApplicationMap
{
public static EntityMap<Widget> Widgets = new EntityMap<Widget>();
public static EntityMap<Gadget> Gadgets = new EntityMap<Gadget>();
}
【问题讨论】:
标签: c# design-patterns generics