跟踪为类和子类创建的实例总数

本文关键字:实例 创建 子类 跟踪 | 更新日期: 2023-09-27 18:14:37

注意:这是家庭作业。

我有两个类,一个继承自另一个。赋值告诉我们要使类能够跟踪每个类创建的实例总数。

class FirstClass 
{
  private static int _instancesCreated = 0;
  public FirstClass()
  {
    _instancesCreated++;
  }
}
据我所知,这段代码运行得很好。问题是我有一个子类,它必须调用它的父类的构造函数。
class SecondClass:FirstClass 
{
  public SecondClass() : base()
  {
  }
}

所以现在的问题是如何正确地将两者分开。因为我必须调用父构造函数的_instancesCreated类将变得不正确,虽然我认为这是真的在某种意义上…?

谢谢你的帮助

跟踪为类和子类创建的实例总数

最简单的方法是使_instancesCreated受保护,然后在每个子类构造函数中递减它。这就是如何使_instancesCreated仅存储基类实例的数量。要计算子类实例,您应该为每个子类添加静态字段,并在构造函数中增加它们,就像在基类中所做的那样。

class SecondClass:FirstClass 
{ 
  private static int _sub_instancesCreated = 0;
  public SecondClass() : base()
  {
      _sub_instancesCreated ++;
  }
}

分别

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