BaseClass与实例计数器

Mob*_*obz 5 c#

我有一个基类和几个派生类(例如BaseChildA : Base).每次我创建一个ChildA类的实例时,我希望它被分配一个唯一的实例编号(类似于关系数据库中的自动增量ID,但对于我在内存中的类而不是在数据库中).

我的问题类似于这个问题,但有一个明显的区别:我希望基类自动处理这个问题.对于我的每个派生类(ChildA,ChildB,ChildC等),我希望基类保持单独的计数,并在创建该派生类的新实例时增加它.

所以,我Base班上的信息可能最终看起来像这样:

ChildA,5
ChildB,6
ChildC,9
Run Code Online (Sandbox Code Playgroud)

如果我然后实例化一个新的ChildB(var instance = new ChildB();),我希望ChildB被赋予id 7,因为它从6开始.

然后,如果我实例化一个新的ChildA,我希望ChildA被分配id 6.

-

我怎样才能在Base班级的构造函数中处理这个问题?

Adr*_*ian 6

您可以Dictionary<Type, int>在基类中使用静态,您可以按类型跟踪派生实例.由于this将是派生类型,您可以将其this.GetType()用作字典中的键.

class Base
{
    static Dictionary<Type, int> counters = new Dictionary<Type, int>();
    public Base()
    {
        if (!counters.ContainsKey(this.GetType()))
            counters.Add(this.GetType(), 1);
        else
            counters[this.GetType()]++;
        Console.WriteLine(this.GetType() + " " + counters[this.GetType()]);
    }
}

class Derived : Base
{
}

class Derived2 : Base
{
}

public static void Main()
{
    new Derived();
    new Derived2();
    new Derived();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Derived 1 
Derived2 1
Derived 2
Run Code Online (Sandbox Code Playgroud)

对于线程安全,您可以使用ConcurrentDictionary<K,V>而不是Dictionary<K,V>.

  • 你在问或说?这是你的答案,我只是评论它.如果您认为concurrentDictionary是一个更好的解决方案,您应该将其编辑到您的答案中. (2认同)