pee*_*nut 14 c# c++ java oop inheritance
有没有办法让所有派生类计算他们的实例?如何(用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 (note that virtual for methods is allowed!):
singleton int singletonMemberBase;
};
class Derived : Base
{
static int sMemberDerived;
int memberDerived;
//my wish (note that virtual for methods is allowed!):
singleton int singletonMemberDerived;
};
//taken apart: (note: XYZStatic classes do not derive)
class Base { int memberBase; }
class BaseStatic { int sMemberBase; } BaseStaticInstance;
class Derived : Base { int memberDerived; }
class DerivedStatic { int sMemberDerived; } BaseStaticInstance;
//note: Derived::sMemberBase is compile-time changed to Base::sMemberBase
//my wish: (note inheritance!)
class BaseSingleton { int singletonMemberBase; } BaseSingletonInstance;
class DerivedSingleton : BaseSingleton { int singletonMemberDerived; } DerivedSingletonInstance;
Run Code Online (Sandbox Code Playgroud)
如果语言中出现类似的内容,我的问题的解决方案将简单而优雅:
//with singleton members, I could write counter like this:
class object
{
singleton int count;
object() { ++count; }
~object() { --count; }
};
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 10
在C++中,您可以使用模板基类来完成.基本上它是一个混合,所以它仍然需要每个类通过继承mixin来合作:
// warning: not thread-safe
template <typename T>
class instance_counter {
public:
static size_t InstancesCount() { return count(); }
instance_counter() { count() += 1; }
instance_counter(const instance_counter&) { count() += 1; }
// rare case where we don't need to implement the copy assignment operator.
protected:
~instance_counter() { count() -= 1; }
private:
static size_t &count {
static size_t counter = 0;
return counter;
}
};
class my_class: public instance_counter<my_class> {};
Run Code Online (Sandbox Code Playgroud)
由于使用模板的每个类具有不同的基类,因此它具有不同的 count函数,因此具有静态变量的不同副本counter.
从使用派生类作为模板参数实例化的模板类继承的技巧称为CRTP.