java - 如何避免子类的类型检查?

标签 java oop

我有这个代码:

public abstract class Character {
    public abstract void attack(Character victim);
    public abstract void receiveAttack(Attack attack);
}

public class CharacterA extends Character {
    public void attack(Character victim) {
        if (victim.getClass().equals(this.getClass())
            return;

        victim.receiveAttack(new Attack(BASE_DMG));
    }
}

这个想法是,一个角色可以攻击其他角色,也可以从其他角色接收攻击,但它不能接收来自其自己类别的角色的攻击(角色A不能攻击另一个角色A,但可以攻击角色B或接收来自其他角色的攻击)角色B)。

我知道检查对象的类型是一种不好的感觉,通常是由于糟糕的设计而引起的,所以问题是我如何更改设计,这样我就不必检查对象类型?

编辑

该类实际上并未命名为Character,该名称只是为了简化示例。

没有团队。 CharacterA 可以攻击除 CharacterA 以外的任何其他 Character

最终编辑

谢谢大家,我用访客模式解决了这个问题。

最佳答案

一个非常简单的解决方案/解决方法可能是只有一个类,并且每个 Character 对象都有一个名为 characterTeamString 字段或类似的东西。对于 A 队中的角色,请将该字段设置为 “A”“ATeam”。对于 B 团队,请将该字段设置为 "B""BTeam"。然后在 attack 方法中比较它们的 characterTeam String

此外,我建议不要使用名为 Character 的类,因为这可能会干扰 char(也名为 Character)的包装类。

关于java - 如何避免子类的类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45363511/

相关文章:

php - 使用oop连接数据库的简单问题

java - 捕获组中的可选子字符串

linux - 如何在 RHEL 中安装 java jdk?

java - 如何使用Java分割带有特殊字符的字符串

java - 在 Java 中根据用户请求从数组中删除/读取特定元素

c++ - 为什么使用对象进行编程不被认为是程序性的?

java - 确定哪些方面 Hook 到给定的类

java - Android 无法启动 Activity android.view.inflate 异常。应用程序在 `setContentView()` 处崩溃

c - 与面向对象相比,对象和实例对于像 C 这样的命令式语言有其他含义吗?

VB.NET 创建一个带有可选输入的类