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()
        {

        }
    }
}