java中类之间的方法可见性

时间:2008-12-04 13:25:01

标签: java visibility

在Java中(并且一般而言)有没有办法让一个类如此公开以至于它的方法等...可以从几乎没有实例化它的小类中访问?哈,我的意思是......如果我有一个爸爸类有一个方法draw()并且它实例化了一个名为Hand的婴儿类和一个名为Deck的婴儿类,然后甲板实例化了一个名为Card的babier类,它有一个方法play()Play()是否有办法从爸爸班级拨打Draw()

这里的想法是......爸爸上课说“Deck!play(card)!”然后甲板上写着“卡!玩()!”然后玩转身说“嘿爸爸!画()!”

PS的想法是......在CCG中,每张卡都有一个不同的“play()”方法,但它们基本上都以相同的方式调用。玩牌的机会来了,你打电话给它玩。但是卡片本身并没有做任何事情:不,不,它从游戏规则中调用了许多方法,这些方法具有可见性。所以,就像MTG中的一张卡片上写着“抽一张牌。对目标牌手造成一次伤害”。正在调用draw(玩家,1)和dealDamage(玩家,1)这些大概不在牌本身......因为他们影响了玩家在开始游戏时可能实例化的变量并且同意了生命总数和规则,例如什么“画”是指?

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

5 个答案:

答案 0 :(得分:4)

当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();
    }
}

答案 1 :(得分:1)

你可以:

  • 通过构造函数传递对象引用。或者通过吸气剂和制定者。或直接到函数。
  • 使用继承。
  • 使用静态类。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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