【问题标题】:method visibility between classes in javajava中类之间的方法可见性
【发布时间】:2010-09-25 07:54:34
【问题描述】:

在 Java 中(一般来说)有没有办法让一个类如此公开,以至于它的方法等......可以从周围的小类访问,甚至不实例化它?哈,我的意思是...如果我有一个爸爸类,它有一个方法draw(),它实例化一个名为 Hand 的婴儿类和一个名为 Deck 的婴儿类,然后 Deck 实例化一个名为 Card 的婴儿类,它有一个方法 @987654322 @,有没有办法让Play() 然后从爸爸班调用Draw()

这里的想法是......爸爸类说“Deck!play(card)!”然后甲板说“卡!玩()!”然后play转身说“嘿,爸爸!Draw()!”

PS 这个想法是……在 CCG 中,每张卡都有一个不同的“play()”方法,但它们基本上都以相同的方式调用。打牌的机会来了,你就打牌。但是卡本身并没有做任何内部的事情:不,不,它从游戏规则中调用了许多方法,这是可见的。所以,就像万智牌中的一张牌,上面写着“抓一张牌。对目标玩家造成一次伤害。”正在调用 draw(player, 1) 和 dealDamage(player, 1) ,它们可能不在卡片本身中......因为它们会影响可能由玩家在开始游戏时实例化的变量,并就生命总数和规则等达成一致“画”是什么意思?

(元问题:像往常一样,有人可以重命名这个问题,以便它反映我的要求......作为一个初学者真是令人沮丧!)

【问题讨论】:

    标签: java visibility


    【解决方案1】:

    你可以:

    • 通过构造函数传递对象引用。或者通过 getter 和 setter。或直接到函数。
    • 使用继承。
    • 使用静态类。

    【讨论】:

      【解决方案2】:

      当 Daddy 类实例化 Baby 类时,它(Daddy)可以将对自身的引用传递给 Baby 构造函数,从而使 Baby 可​​以访问其所有公共方法。

      class Daddy {
          public foo(){...}
          public createBaby(){
              Baby baby = new Baby(this);
              // baby now has a reference to Daddy
          }
      }
      
      
      class Baby {
          Daddy daddy;
          public Baby(Daddy daddy){
              this.daddy = daddy;
          }
          ...
          public callDaddy(){
              daddy.foo();
          }
      }
      

      【讨论】:

      • 好的,所以我猜我所做的是:我把爸爸变成了一本“规则书”之类的东西,并将对它的引用传递给所有婴儿类,这样他们就可以做规则让他们这样做。其实我觉得这很棒!
      • 两年半,没有人开过“爸爸妈妈”的玩笑? :-)
      【解决方案3】:

      从面向对象的角度来看,我会说使用继承。一种方法是创建一个不实现子类行为不同的方法的抽象类;并实现对所有子类行为相同的方法。

      【讨论】:

        【解决方案4】:

        看起来您正在尝试实现某种double dispatching

        【讨论】:

          【解决方案5】:

          您还可以定义内部类和外部类。然后内部类可以访问外部类的所有字段。

          public class OuterClass{
              int x
              private class InnerClass{
                  InnerClass(){
                      x = 10;
                  }
              }
          }
          

          但是,使用单例模式可能会更好,在这种模式中,您有一个对单个资源的静态引用(就像大多数纸牌游戏的套牌一样,尽管 CCG 往往每个玩家都有一个),或者否则在对象的构造函数中传入共享资源。在 MTG 或类似的情况下,我可能会给每张卡一个 cast() 方法,该方法接受一个 Player 和一个目标列表。玩家是施法者,因此像 Brainstorm 这样的咒语可以在玩家上调用 draw() 来让他们抓牌,而永久咒语则可以在玩家的控制下分配自己。然后,目标将是该法术可能需要的任何其他目标,并且可能为 null 或空列表(无论您认为哪个更合适)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-12
            • 2013-09-30
            • 1970-01-01
            • 2011-01-14
            • 2014-07-20
            • 1970-01-01
            • 2013-02-25
            • 2021-09-02
            相关资源
            最近更新 更多