gpt4 book ai didi

java - 抽象方法中的共享功能

转载 作者:行者123 更新时间:2023-11-28 02:46:35 25 4
gpt4 key购买 nike

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

不同的项目在设置标签时做不同的事情,但最后他们应该都做同样的事情,这是一系列的内务 Activity 。我知道我可以在基类中创建一个方法来完成这些杂务,然后在每个实现中调用它,但这很糟糕,因为除其他外,如果我忘记从一个实现中调用它,它会产生一个错误.

什么是构造它的好方法?

这里是示例代码(我现在是如何用 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();

现在,我只是将这些行复制并粘贴到每个实现中,但我宁愿它们以某种方式在基类中完成,所以我可以保证它们始终发生。这些必须其他一切之后调用。

解决方案:

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

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

abstract protected void __setLabel( String s );

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

最佳答案

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

关于java - 抽象方法中的共享功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24212445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com