Как я могу поделиться значениями между классами (или получить переменную из другого класса) без создания экземпляра дважды. - PullRequest
4 голосов
/ 10 ноября 2011

Моя проблема в следующем, у меня есть класс, давайте назовем его Theatre.

У этого Theatre есть конструктор, в котором я указываю сумму Seats, которую имеет Theatre.

Класс Show имеет коллекцию Seats, каждый со своими собственными свойствами, такими как bool Empty.

Итак, суммируя код:

class Theatre
{
    public Theatre(int numberOfSeats)
    {
        this.numberOfSeats = numberOfSeats;
    }
}

Допустим, мы его где-то создали для 100.

Theatre myTheatre = new Theatre(100);

Для класса Show:

class Show
{
    List<Seats> listOfSeats = new List<Seats>();
    public Show()
    {
        for (int i = 0; i < 100; i++) //  <---- And here is my problem!!
        {
            //Code to add to list
        }
    }
}

Моя проблема в том, что я не знаю, как избавиться от этого 100.

Я хотел бы иметь что-то вроде myTheatre.NumberOfSeats, но я не совсем уверен, как это будет работать.

Моя проблема в том, что я уже создал экземпляр моего театра в другом классетак что мне нужно было бы создать новый театр внутри Show, только чтобы получить количество мест, я бы использовал что-то вроде композиции и удаления, но это явно нарушило бы ISP.

Но даже это имеетпроблема, так как, когда я делаю новый Theatre, я должен был бы поставить 100 как параметр и, если этоПрежде чем изменить, я должен был бы изменить это вручную.

Итак, мои вопросы:

  • Я что-то упускаю из виду?(Очень вероятно)
  • Какой подход вы бы порекомендовали?
  • Существует ли что-то вроде общей переменной в разных классах?(Не хочу использовать слово «глобальный», потому что я не уверен, что это то, что я хочу, но это могло бы быть.)представление прояснить ситуацию.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Вот как вы это решаете.Передайте Театр в качестве аргумента для Шоу

 class Theatre
    {
        public Theatre(int numberOfSeats)
        {
            NumberOfSeats = numberOfSeats;
        }
        public int NumberOfSeats { get; private set; }
    }

    class Show
    {
        List<Seats> listOfSeats = new List<Seats>();

        public Show(Theatre theatre)
        {
            for (int i = 0; i < theatre.NumberOfSeats; i++) //  <---- And here is my problem!!
            {
                //Code to add to list
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Theatre myTheatre = new Theatre(100);
            Show myShow = new Show(myTheatre);
        }
    }
2 голосов
/ 10 ноября 2011

Метод Show :: Show может принимать экземпляр Theater в качестве аргумента, который представляет SeatCount в качестве свойства.Вы можете «показать» одно и то же шоу в двух разных кинотеатрах, и у класса «Шоу» не должно быть специальных знаний об этом театре.

Вы также не хотите, чтобы оно было глобальным, поскольку шоу можно показыватьв разных театрах.В этом суть ООП.

Другой вариант - предоставить метод Show в классе Theater, который принимает экземпляр Show в качестве аргумента.

0 голосов
/ 10 ноября 2011

C # - не моя специальность, так что это чисто теоретический подход; во всяком случае:

ISTM, что myTheatre.numberOfSeats уже существует. Все, что вам нужно сделать, это разрешить доступ к нему извне; либо напрямую, сделав его видимость общедоступной / пакетом, либо (лучше), сохранив его приватность / защиту и предоставив доступ через публичный метод получения (метод).

В ООП на основе классов вы должны сообщить экземпляру Show об экземпляре Theatre, чтобы передать ссылку на экземпляр Theatre методу экземпляра Show. В этом случае метод может быть конструктором Show (рекомендуется оставить конструктор по умолчанию без аргументов и вызывать его из специального):

class Show
{
  List<Seats> listOfSeats = new List<Seats>();

  public Show()
  {
  }

  public Show(Theatre theatre)
  {
    this();

    for (int i = 0, len = theatre.numberOfSeats; i < len; ++i)
    {
      /* Code to add to list */
    }
  }
}

Тогда где-то:

Theatre myTheatre = new Theatre(100);
...
Show myShow = new Show(myTheatre);

См. Также: Википедия: принципы и стратегии OOD .

...