首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将相同的操作应用于所有派生对象的任何设计模式

将相同的操作应用于所有派生对象的任何设计模式
EN

Stack Overflow用户
提问于 2014-04-22 02:23:29
回答 2查看 72关注 0票数 1

我有一个场景,我在想我是否可以应用任何设计模式。场景是这样的:一个基类有两个派生类,在main函数中,我们需要在这两个派生类上执行相同的操作。我需要这个在c++中。

例如:

代码语言:javascript
运行
复制
Class Base
{
    virtual bool DoWeHaveToPerformOperation()=0;
    virtual void PerformOperation()=0;
};

Class Derived1:public Base
{
    bool DoWeHaveToPerformOperation();
    void PerformOperation();
};

Class Derived2:public Base
{
    bool DoWeHaveToPerformOperation();
    void PerformOperation();
};

int main()
{
    Derived1 d1;
    if(d1.DoWeHaveToPerformOperation())
    {
        d1.PerformOperation();
    }

    Derived2 d2;
    if(d2.DoWeHaveToPerformOperation())
    {
        d2.PerformOperation();
    }
}

我不是像上面那样在main中编写代码,而是想知道是否有一些方法可以优化代码(或者是否有可以使用的模式)。我正在考虑至少将公共代码移动到一个单独的函数中,并为这两个对象调用它,比如

代码语言:javascript
运行
复制
CheckAndOperate(Base* b)
{
    if(b->DoWeHaveToPerformOperation())
    {
        b->PerformOperation();
    }
}

并为两个派生对象调用它。但我觉得它仍然可以优化..

代码语言:javascript
运行
复制
int main()
{
    base* b1=new derived1();
    CheckAndOperate(b1);
    base* b2=new derived2();
    CheckAndOperate(b2);
    delete b1;
    delete b2;
}

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2014-04-22 02:40:00

Template Method模式通常处理这种类型的事情。

代码语言:javascript
运行
复制
Class Base
{
public:
    void PerformOperation()
    {
        if(DoWeHaveToPerformOperation())
        {
            DoPerformOperation();
        }
    }

protected:
    virtual bool DoWeHaveToPerformOperation()=0;
    virtual void DoPerformOperation() = 0;
};

Class Derived1:public Base
{
    bool DoWeHaveToPerformOperation();
    void DoPerformOperation();
};

Class Derived2:public Base
{
    bool DoWeHaveToPerformOperation();
    void DoPerformOperation();
};

int main()
{
    Derived1 d1;
    d1.PerformOperation();

    Derived2 d2;
    d2.PerformOperation();

    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-22 02:39:17

是的,将公共代码放入一个函数中是正确的做法。

代码语言:javascript
运行
复制
void CheckAndOperate(Base &b) {
  if(b.DoWeHaveToPerformOperation()) {
    b.PerformOperation();
  }
}

此外,您的示例并不真正需要动态分配:

代码语言:javascript
运行
复制
int main() {
  Derived1 d1;
  CheckAndOperate(d1);
  Derived2 d2;
  CheckAndOperate(d2);
}

编译器可能能够执行内联和反虚拟化,但如果您想鼓励这样做,您可以在模板中实现共享代码:

代码语言:javascript
运行
复制
template<typename CheckableAndOperatable>
void CheckAndOperate(CheckableAndOperatable &x) {
  if(x.DoWeHaveToPerformOperation()) {
    x.PerformOperation();
  }
}

在C++11中,您可以进一步将派生实现方法设置为final;编译器知道,如果它具有派生类型,那么它总是可以取消对最终方法的虚拟化调用:

代码语言:javascript
运行
复制
class Derived1 : public Base {
public:
    bool DoWeHaveToPerformOperation() final;
    void PerformOperation() final;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23203344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档