我可以创建singleton子类吗

Can I create singleton child class?

本文关键字:子类 singleton 创建 我可以      更新时间:2023-10-16

我有一个父类:

class ParentClass {
public:
    ~ParentClass(){}
    static ParentClass &getInstance() {
        static ParentClass instance;
        return instance;
    }
    void methodA() {
        //do some stuff
    }
    void methodB() {
        //do some stuff
        methodA();
        //do some stuff
    }
private:
    ParentClass(){}
}

我想创建子类:

class ChildClass : public ParentClass {
public:
    ChildClass(){}
    ~ChildClass(){}
    methodA() {
        //do some stuff
    }
}

此代码存在一些明显的问题。首先,我不能用这种方式创建ChildClass(父级的构造函数是私有的)。而且似乎ChildClass不能直接继承自ParentClass。这些类非常相似。我不想创建这些类的两个类似副本。

也许我可以为ParentClassChildClass创建一个基类。我不确定,但是否存在从singleton创建子项的方法?

Singleton有一个明确的目标。它必须确保当前环境中只存在给定类型的单个实例。

因此,我看不出有什么好的理由让methodAmethodB在其中。特别是没有人可以创建ParentClass类型的对象,因此不能调用methodAmethodB(除非它们也变为静态)。我认为更好的OOD是只使用getInstance()方法创建singleton,并单独创建ParentClass,其中包含对singleton返回的对象的引用:

class SingletonClass {
public:
    ~SingletonClass (){}
    static SingleInstanceClass &getInstance() {
        static SingleInstanceClass instance;
        return instance;
    }
private:
    SingletonClass (){}
}
class ParentClass {
public:
    ParentClass(SingleInstanceClass& ref);
    ~ParentClass(){}
    virtual void methodA() {
        //do some stuff
    }
    void methodB() {
        //do some stuff
        methodA();
        //do some stuff
    }
private:
    SingleInstanceClass& singInstRef;
}

然后

class ChildClass : public ParentClass {
public:
    ChildClass(SingleInstanceClass& ref) : ParentClass (ref){}
    ~ChildClass(){}
    virtual void methodA() {
        //do some stuff
    }
}