抽象类构造函数中的抽象方法:设计缺陷?

大石头:

我有一个抽象课Entity每个扩展类Entity都需要一些默认值和一些可自定义的设置:

public abstract class Entity {

    protected Entity() {
        // ... default setup
        customSetup();
    }

    protected abstract void customSetup();
    // ...
}

我的扩展类MyEntity在构造函数中采用一个参数,该参数将用于customSetup()

public class MyEntity extends Entity {

    private Data data;

    public MyEntity(Data d) {
        super(); // in here customSetup() is called!
        data = d;
    }

    @Override
    protected void customSetup() {
        codeDependingOn(data); // will throw NPE: data==null yet!
    }
}

如注释所述,此代码将不起作用。

我可以扔掉customSetup()所有的自定义代码super()然后放进去,但是使用该抽象方法可以使您应该放置的内容更加清楚。

我觉得我违反了OOP设计的某些规则。做我想做的正确方法是什么?

马尔科姆:

调用可以从构造函数中覆盖的方法通常是一个坏主意。问题在于该类尚未完全初始化,并且在子类中调用该方法时,可能会引起麻烦。

看一下这个问题:构造函数中可重写的方法调用出了什么问题,它有很好的解释。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章