基类是否需要定义仅被子类调用的构造函数,还是使用默认构造函数?
问题结论
不能直接将基类Foo的三参数自定义构造函数替换为默认无参构造,是否保留该构造函数需要结合你的设计诉求判断,具体分析如下:
核心原因分析
- 直接替换会触发编译错误:子类
Bar的构造函数中显式调用了super(a, b, c),如果父类移除了三参数构造、仅保留默认无参构造,这句调用会直接找不到匹配的父类构造方法,代码无法编译通过。 - 从封装角度看可以优化访问权限:既然这个三参数构造仅被子类使用,你完全可以把它的修饰符从
public改成protected,避免外部无关代码随意调用该构造实例化Foo,更符合封装原则。 - 从代码复用角度看建议保留:如果父类
Foo的三参数构造中包含通用的成员初始化逻辑,保留该构造可以避免所有子类重复实现相同的初始化代码,符合DRY(不要重复自己)原则。如果后续你还要扩展其他Foo的子类,这个构造可以进一步降低重复代码量。
可以考虑移除的特殊场景
只有同时满足以下所有条件时,你才可以考虑把三参数构造替换为默认无参构造:
- 父类
Foo的三参数初始化逻辑可以完全被无参初始化替代,比如原来的三个参数可以设置固定默认值,不会影响父类方法的正常运行 - 你同步修改子类
Bar的构造函数,移除super(a, b, c)的调用,适配父类的无参构造 - 不存在其他继承
Foo的子类使用这个三参数构造
内容的提问来源于stack exchange,提问作者Guest User
相关产品推荐
相关产品推荐

