java - 如何为两个不同的子类创建一个父类(super class)

标签 java software-design subtitle

想象一下这样的事情: 我有两个类: 节点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 实现此功能。鉴于您的纸牌游戏示例,其中值可能是可选的,您可以考虑返回 nullgetValueNodeB 。稍微好一点的方法可能是使用 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/

相关文章:

java - 将自定义方法添加到 Spring RepositoryRestResource

java - Hibernate 错误地实现了多对多关系?

domain-driven-design - 领域驱动设计中的模型应该有多现实?

json - 解析和转换 TED 演讲 JSON 字幕

java - 无法解析 JSON

请求运行时权限时出现java.lang.StackOverflowError

java - 生产者/消费者 : no producer/consumer should block other producer/consumer

java - Android 发布/订阅单例示例

ffmpeg - 自动将输出文件与输入文件匹配(Applescript x FFMPEG)

video - 如何使用带有 Nvidia Acceleration (Nvenc) 的 FFMPEG 对字幕进行硬编码/刻录