java - 如何为两个不同的子类创建超类
问题描述
想象一下:我有两个类:NodeA 和 NodeB。NodeA 存储一个 Integer 并具有一个 getter 方法。NodeB 没有。
现在我想创建一个超类节点,它可以调用getter-Method。但是我不希望 NodeB 存储一个整数。我该如何处理?
使用下面的代码,NodeB 会引发异常。超类 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();
}
}
编辑:此处添加了以下虚假答案的解释。
我的工作是创建一个纸牌游戏。我有 NormalCards 和 Jokers。NormalCard 有一个价值,而笑话则没有。我想要一个超类的原因是我可以创建一个列表
想象一下,您想遍历列表并对所有值求和。
由于笑话没有价值,我必须检查卡片是否是小丑。如果不将其转换为 NormalCard 并获取值。e 我的老师说,演员表是邪恶的......所以我正在寻找替代方案。
解决方案
简短的回答是:你没有。
稍微长一点的答案:如果你觉得有必要这样做,你应该改进你的设计。这违反了 OO 设计原则,尤其是LSP。
只是成像具有这样的方法:
void printValue(Node node) {
System.out.println(node.getValue());
}
你怎么知道这是否行得通?在运行时它可能会抛出异常,它可能会起作用,谁知道呢,这显然很糟糕。
您可能更想要的是创建一个界面
public interface ValueProvider {
Integer getValue();
}
并且只为NodeA
. 鉴于您的纸牌游戏示例,其中值可能是可选的,您可以考虑返回of 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 - 如果不存在则根据点字符串包名创建目录
- python - 我如何阅读特定的一行以及该行下的另外 7 行
- c++ - 读取函数会影响文件的获取指针吗?
- gcc - 如何在 rustc 中使用 gcc 标志
- javascript - 根据位置替换 url 中的 GET 参数(正则表达式)
- mysql - Vue JS 组件中 MySQL 的嵌套 JSON 总和
- asp.net - 如何在 ASP.NET 中正确发布 formcollection?
- ruby-on-rails - “rails new blog”的 Rails 基本安装问题
- python - Django - 转换 datetime.date 元组
- ruby - 使用 ARGV 创建目录