使用扫描仪摘要 class

Abstract class with scanner

我正在为一个 CS 项目制作游戏,其中一个要求是只有一个用于人工输入的扫描仪。如果我制作一个具有扫描仪对象的抽象 class "player",并创建两个扩展 "player" 的 "human" class,它们是否每个都有自己的扫描仪还是他们共享 "player" 扫描仪?另外,游戏结束后如何关闭扫描器?

do they each have their own scanner or

如果只有 Player class 有 Scanner,child 不会自动有 Scanner,除非 child/other 可以访问classes.

do they share the "player" scanner?

除非您允许他们通过 static 访问或通过 getter 或任何方法访问扫描仪,否则不会直接访问。

how do I close that scanner when I end the game?

您可以在 Player 中声明可以为您完成的方法。我猜你想在人类 win 之一后关闭扫描仪。

此外,值得注意的是,Scanner 不是线程安全的,如果您正在处理多线程的东西。因此,我建议您最好为个人创建单独的 Scanner,并在该人输掉游戏后关闭它。

如果您从 System.in 获取输入,您应该有共同的 Scanner,否则关闭一个 Scanner 将阻止所有其他 Scanner 读取。

您可以有单个 Scanner 实例,为此您可以使用 Singleton 设计模式。

abstract class Player {
   private static final Scanner scanner = new Scanner(System.in);

   public Scanner getScannerInstance() {
       return scanner; 
   }
}

根据您的意见和问题,我知道您创建了一个 Player 摘要 class 和两个具体的 Human class。而且您实际上只想拥有一台扫描仪。

在这种情况下,您应该在 Player class static 中创建 Scanner 字段。这样你就只有一个实例Scanner。你可能应该添加一个 getter。让我给你看代码:

public abstract class Player {
    private static Scanner scanner = new Scanner (System.in);

    public static Scanner getScanner () {
        return scanner;
    }
}

如果您想关闭扫描器,只需调用close:

Player.getScanner().close();

是不是很简单?

我不明白的另一件事是,为什么要创建摘要 class?这是我的建议:使 Player 成为具体的 class 并创建两个 Player 对象来代表两个玩家。我看到很多人犯了这个错误。初学者通常喜欢创建 classes 而不是对象。继承意味着"is a kind of"。另一方面,创建对象可以解释为 "is a"。所以在你的情况下,人类 是一个 玩家,除非你想让电脑也玩。