作者:yun悠然_434 | 来源:互联网 | 2022-12-02 00:09
我有一个基类和几个派生类(例如Base
和ChildA : Base
).每次我创建一个ChildA
类的实例时,我希望它被分配一个唯一的实例编号(类似于关系数据库中的自动增量ID,但对于我在内存中的类而不是在数据库中).
我的问题类似于这个问题,但有一个明显的区别:我希望基类自动处理这个问题.对于我的每个派生类(ChildA,ChildB,ChildC等),我希望基类保持单独的计数,并在创建该派生类的新实例时增加它.
所以,我Base
班上的信息可能最终看起来像这样:
ChildA,5
ChildB,6
ChildC,9
如果我然后实例化一个新的ChildB(var instance = new ChildB();
),我希望ChildB被赋予id 7,因为它从6开始.
然后,如果我实例化一个新的ChildA,我希望ChildA被分配id 6.
-
我怎样才能在Base
班级的构造函数中处理这个问题?
1> Adrian..:
您可以Dictionary
在基类中使用静态,您可以按类型跟踪派生实例.由于this
将是派生类型,您可以将其this.GetType()
用作字典中的键.
class Base
{
static Dictionary counters = new Dictionary();
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
而不是Dictionary
.
你在问或说?这是你的答案,我只是评论它.如果您认为concurrentDictionary是一个更好的解决方案,您应该将其编辑到您的答案中.