我有一个方法可以将对象添加到静态列表中,如下所示:
@PostConstruct
protected void registerToTransactionList() {
TransactionValidator.registerTransactionList(this);
}
registerTransactionList
方法只是将“this”添加到静态列表中,此方法位于BalanceTransactionValidator
类中,它扩展了TransactionValidator
(静态列表的所有者),问题是{的所有子类{1}}类也被添加到静态列表中,如果我在其中覆盖BalanceTransactionValidator
方法,则会这样:
registerToTransactionList
它不会添加子类,但也不会添加@Override
@PostConstruct
protected void registerToTransactionList() {
}
。有人可以帮我这个吗?请注意,默认情况下,子类会覆盖此方法。
答案 0 :(得分:1)
使方法私有阻止可见性
private void registerToTransactionList() {
}
或使方法最终 to block it from been override
protected final void registerToTransactionList() {
}
答案 1 :(得分:1)
有两种方法可以实现这一目标:
根据其中一条评论中的建议,使方法 final 不会有帮助 - 你的问题不是子类会覆盖那个方法;实质上,您有一个设计问题:您希望子类根本不应该调用该方法。
所以,这里有意义的唯一真实选项是" 2。"。你看,通过在想要扩展的类上使用公共方法,你隐含地说:调用该方法是完全正确的;在作为基类(或子类!)的实例的任何对象上。
在你的情况下,事实并非如此:你实际上不希望这个方法背后的代码运行于子类。那么你不应该把这个方法放在基类的公共/受保护方法列表中!
最后:您可能想退后一步,阅读有关优秀OO设计的内容。类层次结构不会从天而降:你故意为某种目的设计它们。换句话说:继承不仅仅是放一些" A扩展B"在你的班级声明。你必须了解B类的每一个方法;以及你的孩子课程应如何处理它们!
编辑:经过一番思考,我猜你正在做的事情"错误的方式",如:class BaseClass {
public final void doRegistration() {
BaseClass toRegister = getObjectForRegistration();
if (toRegister != null) { ... register toRegister ...
}
protected BaseClass getObjectForRegistration() {
return null;
}
使用该代码,您可以输入
protected BaseClass getObjectForRegistration() {
if (this instanceof ClassThatShouldBeRegistered) {
return this;
}
return null;
}
进入那个想要注册的班级。可能有更好的方法可以做到这一点;但经过一番思考后,我不知道如何避免 instanceof 。但上面的代码应该有效;它只需要在你的基类和那个想要注册的类中的特定代码。