Вложенные классы C # - вызов внешнего метода изнутри - PullRequest
1 голос
/ 09 ноября 2009

У меня есть класс ViewController, называемый GamePlay. В GamePlay есть вложенный класс MyPinAnnotationView. Когда метод MyPinAnnotation TouchesBegan () вызывается, я хочу вызвать метод CheckAnswer () из родительского GamePlay.

Я не хочу создавать новый экземпляр GamePlay, потому что у меня уже установлены переменные и экземпляры. Могу ли я получить доступ к родителю каким-либо образом? (Кроме слушателей событий)

Ответы [ 4 ]

9 голосов
/ 09 ноября 2009

Вложенный класс может ссылаться только на статические члены в родительском элементе. Если вы хотите получить доступ к членам экземпляра, вам нужно получить ссылку на экземпляр. Самый простой способ сделать это - добавить его в качестве параметра в конструктор MyPinAnnotationView примерно так:

class MyPinAnnotationView
{
  private GamePlay gamePlay;

  public MyPinAnnotationView(GamePlay gamePlay)
  {
    this.gamePlay = gamePlay;
  }

  public void TouchesBegan()
  {
    this.gamePlay.CheckAnswer();
  }
}

Когда вы создаете экземпляр MyPinAnnotationView из GamePlay, просто сделайте это:

MyPinAnnotation annotation = new MyPinAnnotation(this);
1 голос
/ 09 ноября 2009

Простой / быстрый способ состоит в том, чтобы сохранить ссылку на родительский класс в дочернем объекте, сделать CheckAnswer() общедоступной, тогда можно легко вызывать метод при необходимости ... но вы можете вернуться и просмотреть дизайн, чтобы убедиться, что это уместно.

1 голос
/ 09 ноября 2009

Если методы, к которым вы хотите получить доступ, не являются статичными, то вам потребуется ссылка на родительский объект (я обычно передаю ссылку на родительский объект в качестве параметра конструктора) для доступа к его методам. В конце концов, вашему дочернему классу нужно знать, с каким экземпляром родительского класса он связан.

0 голосов
/ 09 ноября 2009

Вложенные классы должны использоваться только родительским классом ( см. Этот пост ). Они не должны быть публично видны другим классам, если на то нет веской причины. Которого нет.

Я бы предложил рефакторинг. Попробуйте переместить все API для GamePlay в класс GamePlay. Другими словами, TouchesBegan() должен вызываться для класса GamePlay, который затем вызывает класс MyPinAnnotations.

Никто больше не должен знать о MyPinAnnotations классе - если это необходимо, то это свидетельствует о сбое проектирования.

...