【问题标题】:Inheritance and where to declare an intended universal object继承和在哪里声明一个预期的通用对象
【发布时间】:2009-02-22 11:30:07
【问题描述】:

我有一个 Player 类,它继承自 ArmedHumanoids 类,而 ArmedHumanoids 类又继承自 Humanoids 类。

我应该在何时何地创建Player 对象,以便在我的所有其他类(例如selectPlayerRace 类)中都可以访问它?

我知道通过扩展 Player 类可以访问它,但我被挫败了,因为我的所有其他类都扩展了 JFrame。只能有一个扩展名,不能有两个。

目前,在我的Main 类中创建Player 对象后,当我在selectPlayerRace 中为其编码时,NetBeansIDE 抱怨它无法找到Player 对象。

显然,当我在selectPlayerRace 类中创建Player 对象时会更快乐,但是我无法在我的所有其他类中访问Player 对象,因为它是selectPlayerRace 的内部对象。

Player 对象旨在成为可在我的所有其他类中访问的通用对象。

【问题讨论】:

    标签: java inheritance object


    【解决方案1】:

    Player 对象旨在成为 在我所有的地方都可以访问的通用对象 其他类。

    为什么不直接在其他类的构造函数中或在您调用的方法中传递这个 Player 对象?

    【讨论】:

      【解决方案2】:

      您可以创建 Player 类的对象并将其传递给其他对象,例如接受 Player 类型的构造函数或方法。

      public class Entry
      {
         public static void main(string[] args)
         {
            // initialize a player object
            Player player=new Player("elwynn");
            // initialize some other object which requires player object.
            // since player object needs to be accessed within foo.
            Foo foo = new Foo(player);
            // you are about to use player object within foo.
            foo.MakePlayerPlay(); 
         } 
      } 
      
      public class Foo
      {
      
        Player player;
        public Foo(Player p)
        {
         this.player = p;
        }
      
        public void MakePlayerPlay()
        {
          // you are using player object here
          // which is the same instance you created 
          // within main() in Entry class.
          if(this.player!=null) this.player.play();
        }
      
      }
      

      【讨论】:

        【解决方案3】:

        这听起来像是单例模式。

        public class Player extends ArmedHumanoid {
        
          private static Player instance = new Player();
        
          private Player() {}
        
          public static Player getIntstance() {
            return instance
          }
        
        }
        

        然后任何类都可以调用Player.getInstance() 来访问 Player 对象。

        【讨论】:

        • 这正是我需要的解决方案。它在我的代码中完美运行。例如,我可以在 selectClassType 类中调用 Player.getInstance.classType = "Mage"。非常感谢您为我解决了这个问题。
        【解决方案4】:

        听起来您正在这里寻找static 声明。据我了解,您希望获得对某些 Player 实例的全局访问权限,但不需要 extend 某个其他类或 implement 某个接口来执行此操作(这意味着您不必继承任何行为,您只想访问一个对象)。您可以存储要访问的 Player 实例 static 例如在PlayerManagement 类中。然后,您在其中放置一个静态方法,例如 getPlayer(String playerName),它同步对其数组/向量/包含所有 Player 对象的任何内容的访问,然后返回有问题的对象(或 null,如果未找到)。您可以将类人机器人类链接到 PlayerManagement,反之亦然。

        也许您还想要一个播放器interface。您可以实现任意数量的接口,但只能扩展一个其他类,但您必须重新实现所有功能,因为您无法将任何代码写入接口,只需定义实现该接口的类必须提供的属性/方法。

        【讨论】:

        • 哎呀?!任何评论为什么这被否决了?没听懂?
        【解决方案5】:

        拥有全局对象是不好的风格,因为这样

        • 会使测试变得更加困难,并且

        • 当需要多个实例时会导致问题。

        最好在需要知道的基础上在构造时提供对其他对象的引用(这称为依赖注入),或者在适当的情况下通过参数传递引用。

        也就是说,查看 Singleton 设计模式。

        【讨论】:

        • 查找单例反模式,并记下永远不要使用它。
        猜你喜欢
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 2016-07-20
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多