战士,巫师和游戏规则

问题描述 投票:0回答:2

不久前我正在研究problem,责任主题和应该去的地方出现了。在我的链接问题中,大学是持有所有规则并确保每个学生注册的机构和班级,具有所需的文件。

这让我想起了Eric Lippert撰写的一篇博文:Wizards and Warriors

它写道:

我们继续谈论“规则”,因此显然该程序的业务领域包括称为“规则”的东西,并且这些规则与业务领域中的所有其他对象进行交互。那么那么“统治”应该是一个阶级吗?我不明白为什么不!这是该计划的基本内容。似乎可能存在数百或数千个这些规则,并且它们可能随着时间而改变,因此将它们编码为类似乎是合理的。

规则:

  • 战士只能使用剑。
  • 向导只能使用员工。

我的问题是如何在GameRules class中确定传递的具体对象以验证我是否可以携带它?

public final class GameRules {

    public static boolean verifyifwizardcancarry(Weapon weapon){
        boolean canCarry  = false
        if weapon is a a staff set canCarry to true
        return canCarry;
    }
 }

public abstract class Player{   

   private List<Weapon> weapons;
   // constructor and OOP goodness left out

   public abstract void add(Weapon weapon);

}


public final class Wizard extends Player{

   @Override 
   public void add(Weapon weapon){

      if(GameRules.verifyifwizardcancarry(weapon){
          // - code to add weapon to inventory
      }
    }
 }

如何验证传递给Weapon GameRulesclass实际上是Sword?从阅读,使用instanceofgetClass()被认为是代码气味。

我找到了this的答案,但是它违反了LSP,违背了博客所说的,它不应该抛出异常,并没有真正回答我的问题。

java oop inheritance
2个回答
0
投票

按照这个Java dynamic binding and method overriding

当添加一个Sword时,可以调用这样的函数,而不是武器的任何其他子元素

public void add(Sword sword){
    //nope
}

如果只能配备一个(或几个)武器,也可以这样做,但是Overriden功能会给出否定响应。


0
投票

在你的情况下,我认为你不能避免使用instanceof算子。我建议你自己制作每个具体的Player,负责确定它能携带什么武器。因此,移除GameRules.verifyifwizardcancarry并在玩家之间传播这种逻辑,以便Wizardinstanceof进行武器检查,其他玩家也这样做。

© www.soinside.com 2019 - 2024. All rights reserved.