RAY*_*RAY 7 java inheritance constructor subclass
我想为一组类定义一些常见的构造后行为.当您在不同的类中共享行为时,Java会告诉我们将它们提取到父类中.
从概念上讲,我们说,对于这种类型的对象(及其子类),在它构造之后进行一些后处理是有道理的;
实际上,这很难做到.您显然不能将它放在父类构造函数中,因为在子类构造函数之前调用父构造函数.我可以在父类中编写一个postInit()方法,并要求所有子类将它作为构造函数中的最后一个语句来调用,但它看起来不是很干净,因为没有办法强制执行它,人们会忘记.
是否有一些我不知道的语言结构可以解决我的问题?
谢谢
关于要求的更多背景知识.下面的许多答案(我已经投票)提出的工厂方法等都是好主意,但我并没有那么奢侈.实际情况是这样的,我有这个父类,它由几十个子类扩展,这些子类又在许多其他地方使用.因此,重新设计如何使用这些子类是不可能的,并且更改所有子类是可能的边界.理想情况下,我只需要更改父类,这就是我所要求的.
如果出于实用原因无法使用工厂方法,我能想到的最佳解决方案是protected final在根类中创建一个进行后处理的方法,并向每个叶类添加对该方法的调用;例如
public abstract class Root {
...
protected final void finishInit() {
// Do post-processing
}
}
public abstract class Intermediate {
...
protected Intermediate(...) {
super(...);
...
// don't call finishInit();
}
...
}
public class Leaf {
...
public Leaf(...) {
super(...);
...
finishInit();
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果Intermediate不是,abstract那么您需要一个单独的公共构造函数来创建finishInit()在最后调用的实例。
这一切都有点笨拙,但如果您不能/不会重构代码以使用工厂方法,这就是您必须付出的代价。
| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |