gpt4 book ai didi

c# - 带有实例计数器的基类

转载 作者:太空狗 更新时间:2023-10-29 23:05:00 24 4
gpt4 key购买 nike

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

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

所以,保存在我的 Base 类中的信息最终可能看起来像这样:

ChildA,5
ChildB,6
ChildC,9

如果我随后实例化一个新的 ChildB (var instance = new ChildB();),我希望 ChildB 被分配 ID 7,因为它是从 6 开始的。

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

-

如何在我的 Base 类的构造函数中处理这个问题?

最佳答案

您可以使用静态 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();
}

输出:

Derived 1 
Derived2 1
Derived 2

为了线程安全,你可以使用 ConcurrentDictionary<K,V>而不是 Dictionary<K,V> .

关于c# - 带有实例计数器的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52869531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com