C# 跟踪为类和子类创建的实例总数
注:这是家庭作业 我有两个类,一个继承自另一个。分配告诉我们使类能够跟踪每个类创建的实例总数C# 跟踪为类和子类创建的实例总数,c#,C#,注:这是家庭作业 我有两个类,一个继承自另一个。分配告诉我们使类能够跟踪每个类创建的实例总数 class FirstClass { private static int _instancesCreated = 0; public FirstClass() { _instancesCreated++; } } 据我所知,这段代码运行良好。问题是我有一个子类,它必须调用其父类的构造函数 class SecondClass:FirstClass { public Se
class FirstClass
{
private static int _instancesCreated = 0;
public FirstClass()
{
_instancesCreated++;
}
}
据我所知,这段代码运行良好。问题是我有一个子类,它必须调用其父类的构造函数
class SecondClass:FirstClass
{
public SecondClass() : base()
{
}
}
所以现在的问题是如何正确地将两者分开。因为我必须调用父构造函数,所以为该类创建的_instances将变得不正确,尽管我认为它在某种意义上是正确的
谢谢你的帮助
class SecondClass:FirstClass
{
private static int _sub_instancesCreated = 0;
public SecondClass() : base()
{
_sub_instancesCreated ++;
}
}
分别地
最简单的方法是使_instancesCreated受到保护,然后在每个子类构造函数中减少它。这就是如何使_instancesCreated只存储基类实例的数量。为了计算子类实例,您应该为每个子类实例添加静态字段,并在构造函数中递增它们,就像在基类中一样。更通用的解决方案(如果有点过分):
使用系统;
使用System.Collections.Generic;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
新基类();
新基类();
新的DerivedClass();
WriteLine(“基类:{0},派生类:{1}”,
BaseClass.CountInstances(),
BaseClass.CountInstances());
}
}
公共类基类
{
公共静态字典实例计数=
新字典();
公共静态int CountInstances(),其中T:BaseClass
{
返回BaseClass.InstanceCount.ContainsKey(typeof(T))?BaseClass.InstanceCount[typeof(T)]:0;
}
公共基类()
{
如果(!InstanceCount.ContainsKey(this.GetType()))
{
InstanceCount[this.GetType()]=0;
}
InstanceCount[this.GetType()]++;
}
}
公共类派生类:基类
{
公共类()
:base()
{
}
}
}
在派生类中添加另一个静态私有字段,并在对父类执行操作时递增该字段。显然,派生实例将被计算为父实例,这可能是您想要的,也可能是问题所在。如果您想将FirstClass
单独处理,请让您的程序计算FirstClass.instances-SecondClass.instances
。这只提供了FirstClass
@geogeduckett的总实例,减法是不够的。@HenkHolterman遗憾的是,赋值没有指定这一点。我不确定老师想要什么,我想这两种方法都可以。@eml我编辑了我的答案-对于单独的计数,它将用于计算子类。但是_instancesCreated将存储错误数量的基类实例。@DmitryKruglov当您创建子类时-基类也创建了@RoyiNamir(参考您的评论)是的,这是正确的,理论上基类也是被创建的。我想这不是老师想要的。@RoyiNamir你说得对,但eml想把它们分开计算。@eml理论上??事实上!
class FirstClass
{
private static int _instancesCreated = 0;
public FirstClass()
{
_instancesCreated++;
}
protected FirstClass(int i)
{
}
}
class SecondClass:FirstClass
{
private static int _sub_instancesCreated = 0;
public SecondClass() : base(2) //dummy
{
_sub_instancesCreated ++;
}
}
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new BaseClass();
new BaseClass();
new DerivedClass();
Console.WriteLine("Base classes: {0}, Derived classes: {1}",
BaseClass.CountInstances<BaseClass>(),
BaseClass.CountInstances<DerivedClass>());
}
}
public class BaseClass
{
public static Dictionary<Type, int> InstanceCount =
new Dictionary<Type, int>();
public static int CountInstances<T>() where T : BaseClass
{
return BaseClass.InstanceCount.ContainsKey(typeof(T)) ? BaseClass.InstanceCount[typeof(T)] : 0;
}
public BaseClass()
{
if (!InstanceCount.ContainsKey(this.GetType()))
{
InstanceCount[this.GetType()] = 0;
}
InstanceCount[this.GetType()]++;
}
}
public class DerivedClass : BaseClass
{
public DerivedClass()
: base()
{
}
}
}