相关疑难解决方法(0)

如何查找堆中的对象数

如何在Java程序中找到堆上活动对象的数量?

java heap

20
推荐指数
4
解决办法
3万
查看次数

计算每个派生类的类实例

有没有办法让所有派生类计算他们的实例?如何(用C++,C#,Java之一编写代码)?

想象一下,我可以访问根类(例如对象),并且每个其他类(直接或间接)派生​​自此类.我想要的是:

AnyDerivedClass.InstancesCount()
Run Code Online (Sandbox Code Playgroud)

问题是,必须跟踪静态变量中的计数,但是不可能将静态变量"注入"到基类的派生类中,这仅适用于成员变量.也就是说,我必须写下这样的东西:

class object 
{ 
 private static int count = 0; 
 protected object() { ++count; }
 protected ~object() { --count; } 
 public static InstancesCount() { return count; } 
};

class derived : object 
{
 private static int count = 0;
 public derived() { ++count; }
 public ~derived() { --count; }
 public static InstancesCount() { return count; }
}
Run Code Online (Sandbox Code Playgroud)

这个功能显然是重复的,我不能把它放在基类中.注意有两种计算方法:如果有7个类的derived1实例和8个类的derived2实例,则有(a)15个对象实例或(b)0个对象实例.我不关心哪一个,因为我不能做任何事(使用合理的实用手段,例如想象100个类,其中一半在库中我无法修改).

当然,理论上可以创建(某些运行类型标识符)=> int count的映射,并使用基于丑陋,慢,(运行时类型)的方法(至少在C#,Java中).

当然,如果我可以修改派生类,我可以使用复制粘贴(糟糕),宏(是的,我知道),mixins(不是这些语言)等.但这仍然是真正的丑陋.

这是具体的问题,但它发生在我身上好几次,我希望能够将静态成员"注入"派生类来优雅地解决问题.

非常感谢.

编辑:感谢很好的答案,在C++中,它可能也使用CRTP(奇怪的重复模板模式),但不是在C#/ Java(没有多重继承).当然,必须有权访问派生类并添加这个基类,所以问题仍然存在(如果没有其他方法,这看起来最好).

编辑2:使用当前语言看起来不可能.每个类的静态部分都不是继承(并且是正确的),但是没有与每个类关联的继承单例,因此这些问题不能如此优雅地解决.为了说明这一点,请看下面的代码:普通成员和静态成员是当前的OOP语言功能,"singleton"(或者任何单词)成员是我的建议/愿望:

class Base
{
    static int sMemberBase;
    int memberBase;

    //my wish …
Run Code Online (Sandbox Code Playgroud)

c# c++ java oop inheritance

14
推荐指数
1
解决办法
4278
查看次数

标签 统计

java ×2

c# ×1

c++ ×1

heap ×1

inheritance ×1

oop ×1