3

抱歉标题含糊。

我正在编写一组类,并且我无法想出一种直观的方法来分解基本构造函数中所做的事情和派生构造函数中所做的事情。

我的问题如下:

所有课程都要求按顺序完成步骤 A、C 和 E。因此将它们放在基本构造函数中是有意义的。

步骤 B 和 D 对于每个派生类都是唯一的。

不幸的是,B 必须A之后C之前完成,同样 D 必须C之后E 之前完成。这些是 OpenGL 函数调用,我受限于它们的顺序。

我最初尝试了一些类似的东西,希望尽可能地封装在基类中:

public class MyBase
{
    MyBase()
    {
        A():
        B();
        C();
        D();
        E();  
    }
    void A() {...}
    void C() {...}
    void E() {...}
    virtual void B() = 0;
    virtual void D() = 0;
}

public class MyDerived : public MyBase
{
    MyDerived() : MyBase() {}
    void B() {...}
    void D() {...}
}

但这在 C++ 中是不可能的......

除了:

public class MyBase
{
    MyBase() {}
    void A() {...}
    void B() {...}
    void C() {...}
}

public class MyDerived : public MyBase
{
    MyDerived()
    {
        A():
        B();
        C();
        D();
        E();  
    }
    void B() {...}
    void D() {...}
}

我希望尽可能避免代码重复。

有任何想法吗?

4

2 回答 2

0

如果您确实想在构造函数中调用它,并且不同意之后调用它,您可以通过执行以下操作来稍微减少混乱。

public class MyBase
{
    protected:
    void templateMethod()
    {
        A():
        B();
        C();
        D();
        E();  
    }
    private:
    void A() {...}
    void C() {...}
    void E() {...}
    virtual void B() = 0;
    virtual void D() = 0;
};

public class MyDerived : public MyBase
{
    MyDerived() : MyBase() {templateMethod();}
    void B() {...}
    void D() {...}
};

不过,这并不是一个真正的模板方法模式,因为现在所有派生类都必须调用它,而不是为基类调用一次。

于 2013-02-20T02:02:27.233 回答
0

鉴于在构造函数中调用虚函数可能很危险,使用宏对您来说是一种可接受的解决方案吗?

#define MY_BASE_INIT A();B();C();D();E();

public class MyBase
{
    MyBase() {}
    void A() {...}
    void C() {...}
    void E() {...}
}

public class MyDerived : public MyBase
{
    MyDerived()
    {
        MY_BASE_INIT
    }
    void B() {...}
    void D() {...}
}
于 2013-02-20T02:53:16.527 回答