gpt4 book ai didi

java - 子类初始化的模式

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:13 24 4
gpt4 key购买 nike

情况

我有一个类Child,它是Parent的子类。两者都访问成员(member)号码。它看起来像这样:

Parent.java

public abstract class Parent {

int number = 1;

public Parent() {

init1();

System.out.println("parent:" + this);

init2();

}

public abstract void init1();

public void init2() {
System.out.println("init2: " + number);
}

public String toString() {
return String.valueOf(number);
}

}

Child.java

public class Child extends Parent {

public Child() {
super();
}

@Override
public void init1() {
number = 2;
}

}

问题

我需要更改number的值,使其在Parent的构造函数流程中有所不同。明显的解决方案是:

  • Parent的构造函数中提供number并将其设置在那里。但问题是初始化值可能很多,因此方法签名可能会变得很大。我更喜欢在 Parent 中使用默认值,而不是必须扩展例如Parent 的构造函数并从每个子类移交默认参数。而且我也不想要许多不同的构造函数,每个构造函数都有默认值。
  • Childinit()中设置编号。这里的问题是 Child 必须知道它必须在 init() 而不是构造函数中执行某些操作。必须了解子类中的某些内容永远都不好。

问题

是否有更好的方法或模式来解决此类问题,而不是例如使用抽象类?

最佳答案

我想到的最简单的方法是在 Parent 构造函数中需要一个 Options 参数,并在该选项类型中设置默认值:

public class Parent {
public Parent(Options options) {
// ...
}
}

// Default values set here
public class Options {
public int someInt = 42;
public String someString = "Hello world!";
}

关于java - 子类初始化的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35621014/

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