我有以下课程:
public abstract class Manager<T> {
protected static List<T> items = new List<T>();
public static void Register(T item){
if(!items.Contains(item)){
items.Add(item);
}
}
public static void DeRegister(T item){
if(items.Contains(item)){
items.Remove(item);
}
}
}
然后我有扩展上述类的类:
public class InventoryManager : Manager<InventoryItem> {
}
或者:
public class ExampleManager : Manager<ExampleItem> {
}
问题在于items
是静态的,因此扩展管理器的两个类将共享同一个字段。我该怎么做才能让他们不分享这个领域但我仍然可以打电话给InventoryManager.Regiser(this)
?
答案 0 :(得分:2)
根据评论中的要求,改写为答案:
Manager<InventoryItem>
和Manager<ExampleItem>
已经是具有不同静态字段的不同类型。您的代码应该完全符合您的要求。您没有任何Manager
类,只有Manager<T>
泛型类,其中每个泛型类型参数为您提供不同的具体类。不同的具体类意味着不同的静态字段。只需尝试就可以轻松看到这一点。将项目添加到InventoryManager.items
,然后检查ExampleManager.items.Count
。
评论中也指出Manager<InventoryItem>.items
和Manager<ExampleItem>.items
不能是同一个对象,因为它们有不同的类型。那是对的。但是,值得注意的是,即使对于非依赖字段类型,您也会获得不同的静态字段。
using System;
class GenericBaseClass<T>
{
public static int field;
}
class DerivedClass1 : GenericBaseClass<DerivedClass1>
{
}
class DerivedClass2 : GenericBaseClass<DerivedClass2>
{
}
static class Program
{
static void Main()
{
DerivedClass1.field = 2;
DerivedClass2.field = 3;
Console.WriteLine($"DerivedClass1.field: {DerivedClass1.field}");
Console.WriteLine($"DerivedClass2.field: {DerivedClass2.field}");
}
}
输出:
DerivedClass1.field: 2 DerivedClass2.field: 3
答案 1 :(得分:-1)
与实例对象无关的静态字段或属性。它们与类型对象有关。
https://msdn.microsoft.com/en-us/library/98f28cdx.aspx
您应该将Register和DeRegister方法声明为非静态方法。
另外
protected static List<T> items = new List<T>();
对于两种类型都不是相同的字段,因为取决于T它将是不同的类型。