入れ子になった C# クラス - 内部メソッドから外部メソッドを呼び出す
-
19-09-2019 - |
質問
GamePlay という ViewController クラスがあります。GamePlay には、MyPinAnnotationView という入れ子になったクラスがあります。MyPinAnnotation のメソッド TouchesBegan() が呼び出されたときに、親 GamePlay からメソッド CheckAnswer() を呼び出したいと考えています。
変数とインスタンスがすでに設定されているため、新しい GamePlay インスタンスを作成したくありません。何らかの方法で親にアクセスできますか?(イベントリスナー以外)
解決
ネストされたクラスは、親だけで静的メンバを参照することができるようになります。あなたは、インスタンスメンバにアクセスしたい場合は、インスタンスへの参照を取得する必要があります。これを実行する最も簡単な方法は、そのような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);
他のヒント
あなたがアクセスしたいメソッドが静的でない場合は、あなたがそのメソッドにアクセスするために(私は一般的に、コンストラクタのパラメータとしてで親オブジェクトの参照を渡す)親オブジェクトへの参照が必要になります。結局のところ、あなたの子供のクラスは、それが関連する親クラスのどのインスタンスかを知る必要があります。
簡単/簡単な方法は、子オブジェクト内の親クラスへの参照を保持CheckAnswer()
を公開することであろう、それは必要な時にメソッドを呼び出すことは簡単です...しかし、あなたは戻ってデザインを確認することをお勧めしますこれが適切であることを確認する。
ネストされたクラスは、親クラス (この投稿を参照してください)。本当に正当な理由がない限り、他のクラスに公開すべきではありません。それはありません。
これをリファクタリングすることをお勧めします。すべての API を移動してみてください GamePlay
に GamePlay
クラス。言い換えると、 TouchesBegan()
に呼び出される必要があります GamePlay
クラスが呼び出されます。 MyPinAnnotations
クラス。
他の人には知られてはいけません MyPinAnnotations
クラス - 必要な場合、それは設計の失敗を示しています。