Видимость метода между классами в Java - PullRequest
1 голос
/ 04 декабря 2008

В Java (и вообще) есть ли способ сделать класс настолько общедоступным, чтобы его методы и т. Д. Были доступны из маленьких классов, которые даже не создают его экземпляры? Ха, я имею в виду ... Если у меня есть класс папы, у которого есть метод draw(), и он создает экземпляр детского класса с именем Hand, а другой с именем Deck, а затем колода создает экземпляр более детского класса с именем Card, который имеет метод play(), есть ли способ для Play() затем вызвать Draw() из класса папы?

Идея в том, что ... класс папы говорит: "Колода! Игра (карта)!" а затем колода говорит: "Карта! играть ()!" а затем игра поворачивается и говорит: «Эй, папочка! Нарисуй ()!»

PS Идея в том, что ... в CCG у каждой карты есть метод play (), который отличается, но все они по сути вызываются одинаково. Появляется возможность разыграть карту, и вы вызываете игру на ней. Но карта сама по себе ничего не делает: нет-нет, она вызывает ряд методов из правил игры, которые есть для видимости. Так, например, карта в MTG с надписью «возьмите одну карту. Нанесите один урон целевому игроку». вызывает draw (player, 1) и dealDamage (player, 1), которые предположительно отсутствуют в самой карте ... так как они влияют на переменные, предположительно созданные игроками, когда они начали игру и договорились об итогах и правилах жизни, таких как «рисовать» значит?

(мета-вопрос: как обычно, может кто-нибудь переименовать этот вопрос так, чтобы он отражал то, что я спрашиваю ... быть новичком очень расстраивает!)

Ответы [ 5 ]

4 голосов
/ 04 декабря 2008

Когда класс Daddy создает экземпляры классов Baby, он (папа) может передавать ссылку на себя в конструктор 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 голос
/ 04 декабря 2008

Вы можете:

  • Передать ссылку на объект через конструктор. Или добытчиками и сеттерами. Или непосредственно к функции.
  • Использовать наследование.
  • Использовать статические классы.
0 голосов
/ 04 декабря 2008

Вы также можете определить внутренние и внешние классы. Внутренние классы имеют доступ ко всем полям внешнего класса.

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

Однако вам, вероятно, будет лучше использовать паттерн Singleton, где у вас есть статическая ссылка на один ресурс (например, колода для большинства карточных игр, хотя в CCG, как правило, по одному на игрока), или остальное, передаваемое в общий ресурс в конструкторе объекта. В случае MTG или чего-то подобного, я бы, вероятно, дал каждой карточке метод cast (), который берет Player и список целей. Игрок является заклинателем, поэтому такое заклинание, как Мозговой штурм, может затем вызвать draw () на Игроке, чтобы заставить их взять карты, тогда как постоянное заклинание может назначить себя под контроль Игрока. Тогда цели будут для любых других целей, которые могут понадобиться заклинанию и могут быть нулевыми или пустым списком (в зависимости от того, что вы считаете более подходящим).

0 голосов
/ 04 декабря 2008

Похоже, вы пытаетесь реализовать какую-то двойную диспетчеризацию .

0 голосов
/ 04 декабря 2008

С точки зрения ОО я бы сказал использовать наследование. Одним из способов является создание абстрактного класса, который не реализует методы, которые не будут вести себя одинаково подклассами; и реализует методы, которые будут вести себя одинаково для всех подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...