【发布时间】:2023-03-07 10:22:01
【问题描述】:
考虑以下情况:
- 我有一个名为
Caracteristic的抽象类,它可以有名称和级别。它还覆盖Object.toString()。 - 我有 3 个
Caracteristic的子代,分别称为CaracteristicA、CaracteristicB和CaracteristicC,它们覆盖了名称(可能还有级别)。 - 我有一个名为
Statistic的抽象类,它有两个抽象函数:int getValue()和一个Object.toString()覆盖。 - 我有一个名为
StatisticA的类扩展Statistic,其中覆盖int getValue()的结果取决于所需的CaracteristicA和CaracteristicB实例。我有一个类似的类,称为StatisticB,但int getValue()的结果取决于所需的CaracteristicC实例。所有的孩子也会覆盖Statistic.toString()。
当我为我的客户创建统计数据时,我正在做一些相当丑陋的事情:
CaracteristicA caracteristicA = null;
CaracteristicB caracteristicB = null;
CaracteristicC caracteristicC = null;
for (Caracteristic currentCaracteristic : listOfCaracteristics) {
if (currentCaracteristic instanceof CaracteristicA) {
caracteristicA = (CaracteristicA)currentCaracteristic;
} if (currentCaracteristic instanceof CaracteristicB) {
caracteristicB = (CaracteristicB)currentCaracteristic;
} if (currentCaracteristic instanceof CaracteristicA) {
caracteristicC = (CaracteristicC)currentCaracteristic;
} else {
throw new IllegalArgumentException("Unknown caracteristic !");
}
}
// "client.addStatistic" expects a "Statistic".
// "StatisticA"'s constructor expects an instance of "caracteristicA" and "caracteristicB".
// "StatisticB"'s constructor expects an instance of "caractersiticC".
client.addStatistic(new StatisticA(caracteristicA, caracteristicB));
client.addStatistic(new StatisticB(caracteristicC));
问题:如果我想添加一个依赖于CaracteristicA 的StatisticC 和Caracteristic 的新子代(我们称之为CaracteristicD),我需要添加一个变量来存储适当的特征,在循环中添加另一个else if 以找到它,然后我终于能够创建具有适当特征的所需统计数据。
我相当肯定我可以简单地处理这整个混乱,我想知道我该怎么做。在 Google 和 Stack Overflow 上搜索似乎将我指向“Factory”和“Visitor”设计模式,但我不确定它们是否会帮助我或让情况变得更糟.
我还尝试将Object getType() 抽象方法添加到Caracteristic 中,孩子们会用他们的类型覆盖它(例如:CaracteristicA getType()),但我意识到如果我提前知道listOfCaracteristics 的哪个孩子,这会起作用正在迭代中。
更新: listOfCaracteristics 通过执行 listOfCaracteristics.add(new CaracteristicA());、listOfCaracteristics.add(new CaracteristicB()); 等来填充。这是抽象类Caracteristic的代码:
abstract class Caracteristic {
private final String name;
private int level;
Caracteristique(String name, int level) {
this.name = name;
this.level = level;
}
public int getLevel() {
return this.level;
}
@Override
public String toString() {
return this.name;
}
}
这是其中一个孩子 (CaracteristicA) 的代码:
class CaracteristicA extends Caracteristic {
public CaracteristicA(int level) {
super("Hello World!", level);
}
public CaracteristicA() {
super("Hello World!", 1);
}
}
【问题讨论】:
-
listOfCaracteristics是如何创建和填充的?能不能把每个Caracteristic的代码也显示一下? -
我用请求的信息更新了问题。其他
CaracteristicX子代与我提供的示例相同。
标签: java class oop abstract-class