gpt4 book ai didi

java - 在构造函数中使用重写方法的替代方法,Java

转载 作者:太空狗 更新时间:2023-10-29 23:07:48 25 4
gpt4 key购买 nike

在我编写的 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()。

我还发现自己在更复杂的情况下做了类似的事情,在构造函数中使用工厂方法,在子类中重写该方法以决定要实现哪个具体类。我能想到的解决这个问题并保持设计模式不变的唯一其他方法可能是在两个阶段的过程中构建;即用最低限度构建,然后调用第二种方法来完成工作。

最佳答案

像这样需要初始化的对象真的需要通过工厂方法来创建。您确实提到了一个工厂,但是是从构造函数中调用的,所以这听起来也不像是直接的方法。如果您只是在基类中有一个工厂、公开不可见的构造函数和一个决定返回哪个具体类的机制,那么该工厂将很容易地执行初始化策略。

关于java - 在构造函数中使用重写方法的替代方法,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com