在我编码的Java项目中,我最终使用了在构造函数中重写的方法。喜欢的东西:在构造函数中使用重写方法的替代方法,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}
}
我现在认识到,虽然在我的情况下,它做工精细,它是有点危险的,因为子类方法被称为已目前仅被构建为一个超类对象(的东西,可能是一个对象在未来添加扩展超类的新类时忽略)。由于创建对象的方式不同,它也不适用于C++。
我能想到让这一轮的唯一方法是向下移动的initialise方法调用的具体类的构造函数:
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()。
我也发现自己在做,在一个构造函数,它是在子类中重写,以决定要实现哪些具体的类使用一个工厂方法更复杂的情境类似的东西。我能想到的另一种方式是保持设计模式,也许可以用两阶段的过程来构建;即最低限度地构建,然后调用第二种方法完成工作。
虽然它不是通常建议调用虚方法从一个构造函数,如果这些方法的目的是初始化,方法大概知道他们不能依靠对象的状态被完全实现(因为这是他们的*存在的d” )这就是说,强制消费者无论如何都需要调用'init()'方法来避免这个问题。 – dlev 2012-07-20 19:07:04
你为什么需要这样做?你能提取复杂的初始化吗?如何建设者,甚至建筑商的层次? – 2012-07-20 23:26:16