想象一下这样的事情: 我有两个类: 节点A和节点B。 NodeA 存储一个 Integer 并且有一个 getter 方法。 NodeB 没有。
现在我想创建一个父类(super class)节点, 可以调用 getter 方法。 但是我不希望 NodeB 存储整数。 我该如何处理这个问题?
使用下面的代码, NodeB 抛出异常。 父类(super class) Node 有一个 Optinal。
public abstract class Node {
public Integer getValue();
}
public class NodeA extends Node {
public Integer value;
public NodeA() {}
@Override
public Integer getValue() {
return this.value;
}
}
public class NodeB extends Node {
public NodeB() {}
@Override
public Integer getValue() {
throw new Exception();
}
}
编辑:此处添加了以下虚假答案的解释。
我的工作是创建一款纸牌游戏。我有普通卡片和 clown 卡片。普通卡片具有值(value),而笑话则没有。我想要一个父类(super class)的原因是这样我可以创建一个列表
假设您想要遍历列表并对所有值求和。
由于笑话没有值,我必须检查卡片是否是 clown 。如果没有将其转换为 NormalCard 并获取值。 e 我的老师说, Actor 阵容是邪恶的......所以我正在寻找替代方案。
最佳答案
简短的回答是:你不需要。
稍微长一点的答案:如果你觉得有必要这样做,你应该改进你的设计。这违反了 OO 设计原则,尤其是 LSP .
只是想象有这样的方法:
void printValue(Node node) {
System.out.println(node.getValue());
}
你如何知道这是否有效?在运行时它可能会抛出异常,它可能会起作用,谁知道呢,这显然很糟糕。
您可能更想要的是创建一个界面
public interface ValueProvider {
Integer getValue();
}
并且仅针对 NodeA
实现此功能。鉴于您的纸牌游戏示例,其中值可能是可选的,您可以考虑返回 null
在getValue
的NodeB
。稍微好一点的方法可能是使用 Optional<Integer>
作为 getValue()
的返回类型.
那么你就可以在 NodeA
中有一个方法像:
@Override
public Optional<Integer> getValue() {
return Optional.of(this.value);
}
以及NodeB
@Override
public Optional<Integer> getValue() {
return Optional.empty();
}
关于java - 如何为两个不同的子类创建一个父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54041724/