限制通用子类方法可以在C#中接受的类型 [英] Restrict types a generic subclass method can accept in c#
问题描述
如果标题不明确或重复,我深表歉意.今天,我花了大量的时间在泛型上阅读并寻找类似的情况,但无济于事.
I apologise if the title is ambiguous or if this is a duplicate. I've spent today reading a ton on generics and looking for a similar situation to no avail.
我正在编写一个小游戏引擎.这方面的一个方面是单位"携带资源的能力.有些单位可以携带任何资源,有些单位只能携带某些专门资源.为此,我具有以下结构:
I'm writing a little game engine. One aspect of this is the ability for a 'unit' to carry resources. Some units can carry any resource, some are restricted to carrying certain specialised resources. To this end I have the following structure:
Resource
基类:
public abstract class Resource
{
private int _count;
public int Count
{
get { return _count; }
set { _count = value; }
}
public Resource(int resourceCount)
{
_count = resourceCount;
}
}
然后是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
:
and finally a specialised store WoodStore
where the AddResource
method should only accept Wood
:
public class WoodStore : ResourceStore<Wood>
{
}
为了完整起见,接口IResourceStore
由可以充当资源存储库的任何东西实现:
For completeness the interface IResourceStore
which is implemented by anything that can act as a Resource Store:
public interface IResourceStore
{
void AddResource(Resource resource);
}
如果我运行一个小的控制台应用程序并执行以下操作,则在尝试将Wheat
添加到WoodStore
时会出现错误.但事实并非如此,实际上输出显示WoodStore
现在包含木材和小麦.这是控制台应用程序:
If I run a little console application and do the following I would have expected an error when trying to add Wheat
to a WoodStore
. But it doesn't and in fact the output shows that the WoodStore
now contains Wood and Wheat. This is the console app:
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
,只是为了完整性,尽管没有什么特别之处:
Finally here is Wheat
just for completeness although there is nothing special about it:
public class Wheat : Resource
{
public Wheat(int resourceCount) : base(resourceCount)
{
}
}
我显然在这棵树上叫错了树,希望对我如何限制WoodStore只接受Wood提供任何帮助.最终,会有很多不同的商店受到一定的限制,我正在寻找一种通用的处理方法.
I'm obviously barking up the wrong tree on this one, and would appreciate any help as to how I would go about restricting WoodStore to only accept Wood. Ultimately there will be a lot of different stores that would have certain restrictions and I'm looking for a way to handle this generically.
非常感谢.
推荐答案
您的接口需要通用,您需要在后备存储中使用T
,而且AddResource
中的new List
也不是您想要的我敢打赌:
Your interface needs to be generic and you need to use T
in the backing store, also the new List
in AddResource
is not what you want I bet:
public interface IResourceStore<T> where T : Resource
{
void AddResource(T resource);
}
public class ResourceStore<T> : IResourceStore<T> where T : Resource
{
private List<T> _store = new List<T>();
public IEnumerable<T> Store { get { return _store; } }
public void AddResource(T resource)
{
//_store = new List<T>(); //Do you really want to create a new list every time you call AddResource?
_store.Add(resource);
}
}
这篇关于限制通用子类方法可以在C#中接受的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!