我有一個名爲GamePlay的ViewController類。在GamePlay中有一個名爲MyPinAnnotationView的嵌套類。當MyPinAnnotation的方法TouchesBegan()被調用時,我想從父GamePlay中調用方法CheckAnswer()。嵌套的C#類 - 從內部調用外部方法
我不想創建一個新的GamePlay實例,因爲我已經設置了變量和實例。我可以通過某種方式訪問家長嗎? (除了事件監聽器)
我有一個名爲GamePlay的ViewController類。在GamePlay中有一個名爲MyPinAnnotationView的嵌套類。當MyPinAnnotation的方法TouchesBegan()被調用時,我想從父GamePlay中調用方法CheckAnswer()。嵌套的C#類 - 從內部調用外部方法
我不想創建一個新的GamePlay實例,因爲我已經設置了變量和實例。我可以通過某種方式訪問家長嗎? (除了事件監聽器)
嵌套類只能引用父代中的靜態成員。如果你想訪問實例成員,你需要獲得對實例的引用。要做到這一點最簡單的方法是把它作爲一個參數添加到的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);
如果你想訪問的方法不是靜態的,那麼你將需要一個對父對象的引用(我通常將父對象引用作爲構造器參數傳入)以便訪問它方法。畢竟,你的子類需要知道它所關聯的父類的哪個實例。
謝謝。說得通。 – Bryan 2009-11-09 21:52:16
簡單/快速的方法是在子對象中保留對父類的引用,使CheckAnswer()
爲公共,然後在需要時調用該方法很容易......但您可能想回顧並查看設計以確保這是適當的。
嵌套類只能由父類使用(see this post)。除非有很好的理由,否則他們不應該被其他班級公開看到。哪些沒有。
我會建議重構這個。嘗試將GamePlay
的所有API移動到GamePlay
類中。換句話說,TouchesBegan()
應調用GamePlay
類,然後調用MyPinAnnotations
類。
沒有其他人應該知道關於MyPinAnnotations
類 - 如果他們需要,那麼它表示設計失敗。
這裏有一個文章雷蒙德陳寫了一段時間後(與我有關JScript的後記):http://blogs.msdn.com/oldnewthing/archive/2006/08/01/685248.aspx – 2009-11-09 19:29:47
還有一些關於JScript中此功能的註釋: http://blogs.msdn.com/ericlippert/archive/2005/05/02/414015.aspx – 2009-11-09 19:31:58