首页 > 解决方案 > 如何为两个不同的子类创建超类

问题描述

想象一下:我有两个类: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 我的老师说,演员表是邪恶的......所以我正在寻找替代方案。

标签: javasoftware-designsubtitle

解决方案


简短的回答是:你没有。

稍微长一点的答案:如果你觉得有必要这样做,你应该改进你的设计。这违反了 OO 设计原则,尤其是LSP

只是成像具有这样的方法:

void printValue(Node node) {
   System.out.println(node.getValue());
}

你怎么知道这是否行得通?在运行时它可能会抛出异常,它可能会起作用,谁知道呢,这显然很糟糕。

您可能更想要的是创建一个界面

public interface ValueProvider {
   Integer getValue();
}

并且只为NodeA. 鉴于您的纸牌游戏示例,其中值可能是可选的,您可以考虑返回of null。更好的方法可能是用作.getValueNodeBOptional<Integer>getValue()

然后你可以有一个NodeA类似的方法:

@Override   
public Optional<Integer> getValue() {
    return Optional.of(this.value);
}

并且在NodeB

@Override   
public Optional<Integer> getValue() {
    return Optional.empty();
}

推荐阅读