我有一个抽象方法来设置图形项的标签。有不同类型的项目,所有项目都继承自具有“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
调用。
答案 0 :(得分:1)
答案 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