如果标题不明确或者重复,我深表歉意。我今天花了很多时间阅读有关泛型的内容,并寻找类似的情况,但无济于事。
我正在写一个小游戏引擎。其中一个方面是“单元”承载资源的能力。有些单位可以携带任何资源,有些单位仅限携带某些专门资源。为此,我有以下结构:
The Resource
基类:
public abstract class Resource
{
private int _count;
public int Count
{
get { return _count; }
set { _count = value; }
}
public Resource(int resourceCount)
{
_count = resourceCount;
}
}
then a Resource
专业化Wood
:
public class Wood : Resource
{
public Wood(int resourceCount) : base(resourceCount)
{
}
}
然后我就有了我的通用ResourceStore
:
public class ResourceStore<T> : IResourceStore where T : Resource
{
private List<Resource> _store;
public IEnumerable<Resource> Store { get { return _store; } }
public void AddResource(Resource resource)
{
_store = new List<Resource>();
_store.Add(resource);
}
}
最后是一家专门商店WoodStore
哪里的AddResource
方法应该只接受Wood
:
public class WoodStore : ResourceStore<Wood>
{
}
为了接口的完整性IResourceStore
它是由任何可以充当资源存储的东西实现的:
public interface IResourceStore
{
void AddResource(Resource resource);
}
如果我运行一个小控制台应用程序并执行以下操作,我会在尝试添加时出现错误Wheat
to a WoodStore
。但事实并非如此,事实上输出表明WoodStore
现在包含木材和小麦。这是控制台应用程序:
class Program
{
static void Main(string[] args)
{
WoodStore store = new WoodStore();
store.AddResource(new Wood(10));
store.AddResource(new Wheat(5));
foreach (Resource resource in store.Store)
{
Console.WriteLine("{0} {1}", resource.GetType(), resource.Count);
}
Console.ReadLine();
}
}
最后是这里Wheat
只是为了完整性,尽管没有什么特别的:
public class Wheat : Resource
{
public Wheat(int resourceCount) : base(resourceCount)
{
}
}
显然,我在这棵树上大喊大叫,如果我能帮助我了解如何限制 WoodStore 仅接受木材,我将不胜感激。最终会有很多不同的商店有一定的限制,我正在寻找一种方法来普遍处理这个问题。
非常感谢。