在我编写的 Java 项目中,我最终使用了在构造函数中被覆盖的方法。就像是:
class SuperClass {
SuperClass() {
intialise();
}
protected void initialise() {
//Do some stuff common to all subclasses
methodA();
methodB();
}
protected abstract void methodA();
protected abstract void methodB();
}
class SubClass1() {
SubClass() {
super();
}
protected void methodA() { //Do something }
protected void methodB() { //Do something }
}
class SubClass2() {
SubClass() {
super();
}
protected void methodA() { //Do something else }
protected void methodB() { //Do something else}
}
我现在意识到,虽然在我的情况下它工作得很好,但它有点危险,因为在当前仅构造为 SuperClass 对象的对象上调用了 SubClass 方法(当添加扩展 SuperClass 的新类时可能会忽略这一点)未来)。由于创建对象的方式不同,它在 c++ 中也不起作用。
我能想到解决这个问题的唯一方法是将初始化方法调用向下移动到具体的类构造函数:
class SuperClass {
SuperClass() {
}
protected void initialise() {
methodA();
methodB();
}
protected abstract void methodA();
protected abstract void methodB();
}
class SubClass1() {
SubClass() {
super();
initialise();
}
protected void methodA() { //Do something }
protected void methodB() { //Do something }
}...
这是解决这个问题的常用方法吗?扩展 SuperClass 的所有其他类都需要记住调用 initialise(),这似乎是一种耻辱(而且很容易忘记)。
我还发现自己在更复杂的情况下做类似的事情,在构造函数中使用工厂方法,它在子类中被覆盖以决定要实现哪个具体类。我能想到的解决这个问题并保持设计模式不变的唯一另一种方法可能是在两阶段过程中构建;即以最低限度构造,然后调用第二种方法来完成工作。