2

GamePlayというViewControllerクラスがあります。GamePlayには、MyPinAnnotationViewというネストされたクラスがあります。MyPinAnnotationのメソッドTouchesBegan()が呼び出されたら、親のGamePlayからメソッドCheckAnswer()を呼び出したいと思います。

変数とインスタンスがすでに設定されているため、新しいGamePlayインスタンスを作成したくありません。何らかの方法で親にアクセスできますか?(イベントリスナー以外)

4

4 に答える 4

11

ネストされたクラスは、親の静的メンバーのみを参照できます。インスタンスメンバーにアクセスする場合は、インスタンスへの参照を取得する必要があります。これを行う最も簡単な方法は、次の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);
于 2009-11-09T18:25:51.683 に答える
1

アクセスするメソッドが静的でない場合、そのメソッドにアクセスするには、親オブジェクトへの参照が必要になります(通常、親オブジェクトの参照をコンストラクターパラメーターとして渡します)。結局のところ、子クラスは、親クラスのどのインスタンスに関連しているかを知る必要があります。

于 2009-11-09T18:21:48.250 に答える
1

簡単で迅速な方法は、子オブジェクトの親クラスへの参照を保持し、CheckAnswer()公開することです。そうすれば、必要なときにいつでもメソッドを簡単に呼び出すことができます...しかし、デザインを見直して、これを確認することをお勧めします。適切です。

于 2009-11-09T18:22:44.613 に答える
0

ネストされたクラスは、親クラスのみが使用する必要があります(この投稿を参照)。本当に正当な理由がない限り、他のクラスに公開されるべきではありません。ありません。

これをリファクタリングすることをお勧めします。のすべてのAPIをクラスに移動してみてGamePlayくださいGamePlay。つまり、クラスでTouchesBegan()呼び出され、クラスが呼び出されます。GamePlayMyPinAnnotations

他の誰もMyPinAnnotationsクラスについて知る必要はありません-必要な場合、それは設計の失敗を示しています。

于 2009-11-09T18:23:49.493 に答える