【问题标题】:Nested C# Classes - Calling Outer Method From Inner嵌套 C# 类 - 从内部调用外部方法
【发布时间】:2009-11-09 18:18:20
【问题描述】:

我有一个名为 GamePlay 的 ViewController 类。在 GamePlay 中有一个名为 MyPinAnnotationView 的嵌套类。当 MyPinAnnotation 的 TouchesBegan() 方法被调用时,我想从父 GamePlay 调用一个方法 CheckAnswer()。

我不想创建新的 GamePlay 实例,因为我已经设置了变量和实例。我可以通过某种方式访问​​父母吗? (事件监听器除外)

【问题讨论】:

标签: c# iphone nested-class


【解决方案1】:

嵌套类只能引用父类中的静态成员。如果要访问实例成员,则需要获取对实例的引用。最简单的方法是将其作为参数添加到MyPinAnnotationView 的构造函数中,如下所示:

class MyPinAnnotationView
{
  private GamePlay gamePlay;

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

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

当您从 GamePlay 实例化 MyPinAnnotationView 时,只需这样做:

MyPinAnnotation annotation = new MyPinAnnotation(this);

【讨论】:

    【解决方案2】:

    如果您要访问的方法不是静态的,那么您将需要对父对象的引用(我通常将父对象引用作为构造函数参数传入)才能访问其方法。毕竟,您的子类需要知道它与父类的哪个实例相关。

    【讨论】:

      【解决方案3】:

      简单/快速的方法是在子对象中保留对父类的引用,将 CheckAnswer() 公开,然后在需要时调用该方法很容易......但您可能想返回并查看设计以确保这是适当的。

      【讨论】:

        【解决方案4】:

        嵌套类只能由父类 (see this post) 使用。除非有充分的理由,否则它们不应该对其他班级公开可见。没有。

        我建议重构它。尝试将 GamePlay 的所有 API 移动到 GamePlay 类中。换句话说,应该在GamePlay 类上调用TouchesBegan(),然后再调用MyPinAnnotations 类。

        没有其他人应该知道 MyPinAnnotations 类 - 如果他们需要,那么这表明设计失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-14
          • 2014-08-28
          • 2014-02-11
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2019-04-16
          相关资源
          最近更新 更多