java—如何在使用抽象类的子类中限制抽象类中方法的参数?

bmp9r5qi  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(445)

我一直在尝试设计一组类来模拟一个经典的rpg。然而,我发现自己对如何解决这个问题感到困惑:如何在抽象类中强制使用特定于角色类型(例如坦克、治疗者、dps)的法术/装备等。下面的例子更好地阐明了我的意思。
我有个摘要 PlayableCharacter 所有字符类型继承自的类:

public abstract class PlayableCharacter {
    private Set<Spell> mSpells;

    ...

    public void addSpell(Spell spell) { 
        mSpells.add(spell);
    }
}

例如:

public class Healer extends PlayableCharacter {  ...  }
public class Tank extends PlayableCharacter {  ...  }

注意 SetSpell 在抽象类中。我想它如果每个子类 PlayableCharacter 可以用它 addSpell 方法的类型 Spell 对应于 PlayableCharacter 子类型。比如我有这些 Spell 课程:

public abstract class Spell {  ...  }
public class HealerSpell extends Spell {  ...  }
public class TankSpell extends Spell {  ...  }

我只想 Healers 使用 HealerSpells 以及 Tanks 使用 TankSpells 例如:

PlayableCharacter tank = new Tank();
tank.addSpell(new TankSpell());    // This is fine
tank.addSpell(new HealerSpell());  // I want to prevent this!

我想把 PlayableCharacter 它是自己的 Set 子类特定的 Spells ,但这会产生大量代码重复。
我也试着 PlayableCharacter.addSpell 标记为protected,则每个子类都必须实现如下接口:

public interface Spellable<T extends Spell> {  void addClassSpell(T spell);  }

实现它的每个子类都会调用 super.addSpell(spell); 但这会导致更多的代码重复,而且没有什么能迫使这些实现做同样的事情 super 打电话。
我的策略在某些方面存在根本性的缺陷吗?有什么建议吗?我觉得这个问题会越来越严重,因为我添加了更多特定于角色类型的装备、特质等等。

snz8szmq

snz8szmq1#

到目前为止你的情况还不错
剩下的,多想想战略模式而不是超级呼叫
所以抽象类可以有执行步骤1,步骤2,步骤3的算法和可能的父实现
子类可以重写它,但只能重写不同的部分
当您调用算法时,它将执行所有步骤
如果一切都变得太大,步骤本身可以是不同的具有逻辑的类

gcmastyq

gcmastyq2#

可以让每个可玩角色的子类存储允许的子单元类。然后做一个if(allowedspell的咒语示例)。。。

2o7dmzc5

2o7dmzc53#

我不会那样做(通过类型继承)。最好给咒语本身添加特征,因为它是一个咒语,只能由某个角色施法。另外,一个特定的咒语只能被施放到特定的角色类型。这些规则属于咒语,而不是角色。
拼写规则可以在运行时由一个单独的类检查,也可以由系统中的拼写类本身检查 cast() 方法或其他方法。

相关问题