抽象方法中的共享功能

时间:2014-06-13 19:14:58

标签: java c++ oop design-patterns

我有一个抽象方法来设置图形项的标签。有不同类型的项目,所有项目都继承自具有“setLabel()”方法的抽象基类。

不同的物品在设置标签时会做不同的事情,但最后他们都应该做同样的事情,这是一系列的家务活动。我知道我可以在基类中创建一个方法来完成这些杂务,然后在每个实现中调用它,但这很糟糕,因为除了其他事情,如果我忘记从其中一个实现调用它,它将创建一个bug

构建这个的好方法是什么?

以下是示例代码(我现在如何使用Java):

final public void _setLabel( String s ){
    if( s.trim().equals( "null" ) ) return;
    StringBuffer sbError = new StringBuffer();
    if( ! _setConstantValue( s, sbError ) ){
        Error.vShowError( "failed to set value: " + sbError );
        return;
    }
    sLabel = s;
    _update();
    _updateProperties();
    if( _isGroupMember() ) this.nodeGroup._update();
}

基类中有一个抽象方法“_setLabel”,所以我的所有子类都必须实现这个方法。方法中的最后三行始终相同:

_update();
_updateProperties();
if( _isGroupMember() ) this.nodeGroup._update();

现在,我只是将这些行复制并粘贴到每个实现中,但我宁愿他们以某种方式在基类中完成,所以我可以保证它们总是会出现。这些必须在>之后被称为

SOLUTION:

根据下面的标记答案(感谢user3736255),解决方案是使用C ++中的非虚拟接口或Java中的模板方法(相当于)。所以新的基类代码是:

final public void _setLabel( String s ){
    __setLabel( s );
    _update();
    _updateProperties();
    if( _isGroupMember() ) this.nodeGroup._update();
}

abstract protected void __setLabel( String s );

每个子类实现__setLabel方法,该方法由基类中的模板方法_setLabel调用。

3 个答案:

答案 0 :(得分:1)

听起来您正在寻找非虚拟界面模式:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface

答案 1 :(得分:1)

也许:

class Base() {
   public:
   void setLabel();

   protected:
   virtual void doSetLabel();

   private:
   houseKeepingBefore();
   houseKeepingAfter();
}

void Base::setLabel() {
   houseKeepingBefore();
   doSetLabel();
   houseKeepingAfter();
}

但是,如果您有houseKeepingInbetween,则无法解决您的问题。

答案 2 :(得分:0)

是否要创建扩展基础的装饰器,并使用图形项的相应实例创建。装饰者有责任调用家政活动。所有客户端都调用装饰器而不是实际的图形项。注意:我假设对图形项的所有调用都是通过基础中的已定义/声明的方法。

您也可以使用方面:http://en.wikipedia.org/wiki/Aspect-oriented_programming